使用主要爬取手段 urllib.request模块
成果图
运行结果
制作过程
#淘宝
import urllib.request
import urllib.parse
import time,random,csv
class TaoBao():
#获取请求头和网页链接作为以下使用
def __init__(self):
self.url='https://s.taobao.com/search?q={}&bcoffset=3&ntoffset=3&s={}'
self.headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
"cookie": "isg=BOnpzZFsrYGGUpH39-VzSEJW-pNDtt3oqodoP4veklAPUg1kyAc4uJmAFHbkUXUg; l=eBNeqQCVju9HU_wsBO5anurza77tWIRcGkPzaNbMiInca1xRwFtBINCCCGCWkdtfgtCbM3-PHw1aeRnw8GUZw2HvCbKrCyConxvO.; tfstk=c7fPB3YsZBjb-jR9ZQOEPvELFpPRaKCG9m8BEt-fa6-Kvuvw7see9TuL1PM8FvC..; mt=ci=1_1; uc1=cookie15=U%2BGCWk%2F75gdr5Q%3D%3D&existShop=false&pas=0&cookie14=Uoe2zXwcputqGQ%3D%3D&cookie21=W5iHLLyFeYZ1WM9hVnmS&cookie16=VFC%2FuZ9az08KUQ56dCrZDlbNdA%3D%3D; enc=9Y%2FMSeHapmbZeG6XlvgC0Oc50OvRn5xdM4NeHN0HYeek34jmgMphPmVwAIcXh0NdbH6PjHVamvYGzLQ4TedObw%3D%3D; JSESSIONID=4E454F22121952F877F6A1410E151A0A; alitrackid=login.taobao.com; lastalitrackid=login.taobao.com; _cc_=VT5L2FSpdA%3D%3D; _l_g_=Ug%3D%3D; _nk_=tb144967843; _tb_token_=3eee331efe136; cookie1=UUtLcQJdn1hJFYRew1usFmKmezYbMs1fAYqooiRlRcI%3D; cookie17=Vy0T4dzZRxBIkw%3D%3D; cookie2=1bf4e35f5ffca24ca53818ddbc8719b6; csg=732c7bb3; dnk=tb144967843; existShop=MTYyMDY1MjA5Ng%3D%3D; lgc=tb144967843; sg=364; sgcookie=E1003%2FUEY9wGmTMDOeZkjQQinX56Zs2O%2FCbD02GdpJBV1ymGeEqBl%2BGdklOQBKGXFkc61ayAW3n66TmMS2jJ3V5i4Q%3D%3D; skt=2efc87efd3d4ad05; t=68244622a071e32615a09150a6129bb6; tracknick=tb144967843; uc3=nk2=F5REOtROM2Cp5EQ%3D&lg2=VT5L2FSpMGV7TQ%3D%3D&id2=Vy0T4dzZRxBIkw%3D%3D&vt3=F8dCuwgsuF2ycxNk97A%3D; uc4=id4=0%40VXqdEk6gqB3vwrSDD4ExDn%2BuTkyu&nk4=0%40FY4PaJQ8hS13HmYHjEKTa3sEipEqVw%3D%3D; unb=4104558176; _samesite_flag_=true; xlly_s=1; cna=bPrhGNbpuEMCAd9oFHI1Y8o4; thw=cn; hng=CN%7Czh-CN%7CCNY%7C156"
}
在由于访问服务器的用户很多都是独立信息,这里面的cookie是需要让服务器知道当前用户,Cookie的诞生是为了解决HTTP无状态的特性无法满足交互式web,这里也是我从网上普及到的,希望有点帮助,在获取信息的时候网页源代码是没有我们所要的信息,但是cookie却找到了隐藏的数据信息,接下来就是user-agent是个反爬机制的请求头,有了这个我们也可以顺利获取信息
win电脑的只要按F12就会出来,Mac电脑的右键点击检查会出来,然后点击network,刷新页面之后会出现很多小文档和图片之类随便选择一个在requests headers里面就会有cookie,往下user-agent 也在下面,复制到里面就好
def get_html(self,url):
#响应网页信息,使用urllib.request.Request构造链接
rep=urllib.request.Request(url=url,headers=self.headers)
#链接重新构造好的链接但是里面的名字和页数暂时未知,在函数里面给一个url
res=urllib.request.urlopen(rep)
#获取网页之后读取使用utf-8的模式
html=res.read().decode('utf-8')
#网页获取成功之后解析网页提取需要的价格,名称,和图片链接,调运解析函数
self.re_html(html)
return html
这是一段获取网页信息的代码,我放到函数里面
def re_html(self,html):
#解析函数要做的操作有以下使用的re正则提取数据
list_list=[]
tlt=re.findall('"raw_title":"(.*?)"',html)
pic=re.findall('"pic_url":"(.*?)"',html)
#sal=re.findall('"view_sales":"(.*?)"',html)
price=re.findall('"view_price":"\d+.?\d*"',html)
for i in range(len(price)):
pr = eval(price[i].split(":")[1])
tl= (tlt[i])
pi="http:"+(pic[i])
#sa=(sal[i])
#创建列表存储在列表里面
list_list.append([pr,tl,pi])
tplt = "{:4}\t{:8}\t{:16}\t{:32}\t{:64}"
#print(tplt.format("序号", "价格", "商品名称", "图片链接"))
count=0
for g in list_list:
count+=1
#在自己电脑Python中可以看到自己提取的信息
print(count,g[0],g[1],g[2])
#解析结束保存解析的内容在csv中
self.save_html(list_list)
以上是解析函数获取下要的信息
def save_html(self,list_list):
count=0
xinyue=open('淘宝.csv','a+',encoding='utf-8')
writer=csv.writer(xinyue)
writer.writerow(["价格", "商品名称", "图片链接"])
for g in list_list:
count+=1
writer.writerows([g])
保存为csv文档里面
def run(self):
#构造url却少的名字和页数在主运行函数里面设置
name=input('输入行获得的商品:')
start=int(input('开始页面:'))
end=int(input('结束页面:'))
#编码把输入的中文转换成计算机语言
params=urllib.parse.quote(name)
for i in range(start,end+1):
page=(i-1)*44 #设置页数
url=self.url.format(params,page) #完善URL
html=self.get_html(url) #调运函数运行获取页面信息以及解析函数,最后保存信息未csv
time.sleep(random.randint(1,2))
#print(html)
主要运行函数和制作的逻辑在这个函数里面
上面都是一部分比较重要的代码和爬取的时候我感觉需要注意的地方,代码里面具体的做法我都写着备注,我也是刚学不久很多解释也许不到位,下面是我全部完整的代码
#淘宝
import urllib.request
import urllib.parse
import time,random,csv
class TaoBao():
#获取请求头和网页链接作为以下使用
def __init__(self):
self.url='https://s.taobao.com/search?q={}&bcoffset=3&ntoffset=3&s={}'
self.headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
"cookie": "isg=BOnpzZFsrYGGUpH39-VzSEJW-pNDtt3oqodoP4veklAPUg1kyAc4uJmAFHbkUXUg; l=eBNeqQCVju9HU_wsBO5anurza77tWIRcGkPzaNbMiInca1xRwFtBINCCCGCWkdtfgtCbM3-PHw1aeRnw8GUZw2HvCbKrCyConxvO.; tfstk=c7fPB3YsZBjb-jR9ZQOEPvELFpPRaKCG9m8BEt-fa6-Kvuvw7see9TuL1PM8FvC..; mt=ci=1_1; uc1=cookie15=U%2BGCWk%2F75gdr5Q%3D%3D&existShop=false&pas=0&cookie14=Uoe2zXwcputqGQ%3D%3D&cookie21=W5iHLLyFeYZ1WM9hVnmS&cookie16=VFC%2FuZ9az08KUQ56dCrZDlbNdA%3D%3D; enc=9Y%2FMSeHapmbZeG6XlvgC0Oc50OvRn5xdM4NeHN0HYeek34jmgMphPmVwAIcXh0NdbH6PjHVamvYGzLQ4TedObw%3D%3D; JSESSIONID=4E454F22121952F877F6A1410E151A0A; alitrackid=login.taobao.com; lastalitrackid=login.taobao.com; _cc_=VT5L2FSpdA%3D%3D; _l_g_=Ug%3D%3D; _nk_=tb144967843; _tb_token_=3eee331efe136; cookie1=UUtLcQJdn1hJFYRew1usFmKmezYbMs1fAYqooiRlRcI%3D; cookie17=Vy0T4dzZRxBIkw%3D%3D; cookie2=1bf4e35f5ffca24ca53818ddbc8719b6; csg=732c7bb3; dnk=tb144967843; existShop=MTYyMDY1MjA5Ng%3D%3D; lgc=tb144967843; sg=364; sgcookie=E1003%2FUEY9wGmTMDOeZkjQQinX56Zs2O%2FCbD02GdpJBV1ymGeEqBl%2BGdklOQBKGXFkc61ayAW3n66TmMS2jJ3V5i4Q%3D%3D; skt=2efc87efd3d4ad05; t=68244622a071e32615a09150a6129bb6; tracknick=tb144967843; uc3=nk2=F5REOtROM2Cp5EQ%3D&lg2=VT5L2FSpMGV7TQ%3D%3D&id2=Vy0T4dzZRxBIkw%3D%3D&vt3=F8dCuwgsuF2ycxNk97A%3D; uc4=id4=0%40VXqdEk6gqB3vwrSDD4ExDn%2BuTkyu&nk4=0%40FY4PaJQ8hS13HmYHjEKTa3sEipEqVw%3D%3D; unb=4104558176; _samesite_flag_=true; xlly_s=1; cna=bPrhGNbpuEMCAd9oFHI1Y8o4; thw=cn; hng=CN%7Czh-CN%7CCNY%7C156"
}
def get_html(self,url):
#响应网页信息,使用urllib.request.Request构造链接
rep=urllib.request.Request(url=url,headers=self.headers)
#链接重新构造好的链接但是里面的名字和页数暂时未知,在函数里面给一个url
res=urllib.request.urlopen(rep)
#获取网页之后读取使用utf-8的模式
html=res.read().decode('utf-8')
#网页获取成功之后解析网页提取需要的价格,名称,和图片链接,调运解析函数
self.re_html(html)
return html
def re_html(self,html):
#解析函数要做的操作有以下使用的re正则提取数据
list_list=[]
tlt=re.findall('"raw_title":"(.*?)"',html)
pic=re.findall('"pic_url":"(.*?)"',html)
#sal=re.findall('"view_sales":"(.*?)"',html)
price=re.findall('"view_price":"\d+.?\d*"',html)
for i in range(len(price)):
pr = eval(price[i].split(":")[1])
tl= (tlt[i])
pi="http:"+(pic[i])
#sa=(sal[i])
#创建列表存储在列表里面
list_list.append([pr,tl,pi])
tplt = "{:4}\t{:8}\t{:16}\t{:32}\t{:64}"
#print(tplt.format("序号", "价格", "商品名称", "图片链接"))
count=0
for g in list_list:
count+=1
#在自己电脑Python中可以看到自己提取的信息
print(count,g[0],g[1],g[2])
#解析结束保存解析的内容在csv中
self.save_html(list_list)
def save_html(self,list_list):
count=0
xinyue=open('淘宝.csv','a+',encoding='utf-8')
writer=csv.writer(xinyue)
writer.writerow(["价格", "商品名称", "图片链接"])
for g in list_list:
count+=1
writer.writerows([g])
def run(self):
#构造url却少的名字和页数在主运行函数里面设置
name=input('输入行获得的商品:')
start=int(input('开始页面:'))
end=int(input('结束页面:'))
#编码把输入的中文转换成计算机语言
params=urllib.parse.quote(name)
for i in range(start,end+1):
page=(i-1)*44 #设置页数
url=self.url.format(params,page) #完善URL
html=self.get_html(url) #调运函数运行获取页面信息以及解析函数,最后保存信息未csv
time.sleep(random.randint(1,2))
#print(html)
if __name__=="__main__":
s=TaoBao()
s.run()
运行基本是没有问题的,在获取网页信息的时候和解析数据的时候我花了很久时间弄明白,它的信息在网页源代码是没有的,加了cookie在里面发现需要的信息,beaufifulsoup和xpath不太好用,还是re正则用起来能方便解析