淘宝商品信息定向爬虫
功能描述
(1)目标:获取淘宝搜索页面信息,提取其中商品的名称和价格
(2)技术路线:Requests-Re
接口描述
(1)搜索接口:https://s.taobao.com/search?q=关键词
(2)翻页接口:第二页 https://s.taobao.com/search?q=关键词&s=44
第三页 https://s.taobao.com/search?q=关键词&s=88
获取headers和cookie
(1)使用chrome打开淘宝网站,登陆自己的账户,对某一关键词进行搜索
(2)点击F12,打开开发者工具,其中有四个功能模块:元素(ELements)、控制台(Console)、源代码(Sources),网络(Network)。(在此只用上元素和网络)
(3)点击网络(Network),按F5进行刷新,选择第一个search?开头的。右键打开点击copy,选择copy as curl(bash).
(4)点击进入https://curl.trillworks.com/
(5)将copy as curl(bash)获得的代码黏贴进去即可获得headers和cookie。
具体代码
import requests
import re
def gethtml(url): #定义获取url的函数
try:
header = {
\'authority\': \'s.taobao.com\',
\'cache-control\': \'max-age=0\',
\'upgrade-insecure-requests\': \'1\',
\'user-agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36\',
\'sec-fetch-dest\': \'document\',
\'accept\': \'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\',
\'sec-fetch-site\': \'same-origin\',
\'sec-fetch-mode\': \'navigate\',
\'sec-fetch-user\': \'?1\',
\'referer\': \'*\',#*是referer的内容,这里隐去了。
\'accept-language\': \'zh-CN,zh;q=0.9\',
\'cookie\': \'*\',#*是cookie的内容,这里隐去了。
}
t=requests.get(url,headers=header)
t.encoding=t.apparent_encoding
t.raise_for_status()
return t.text
except:
print(\'爬取失败\')
return \'\'
def perpage(list,html):
try:
plt=re.findall(r\'\"view_price\":\"\d+\.\d*\"\',html)#在元素中使用搜索,发现价格在view_price:后,因此使用正则表达式
llt=re.findall(r\'\"raw_title\":\".*?\"\',html)#同上
l=len(plt)
print(\'该页面有\',l,\'个商品\')
for i in range(l):
price=eval(plt[i].split(\':\')[1])
title=eval(llt[i].split(\':\')[1])
list.append([price,title])
except:
print(\'解析失败\')
return \'\'
def printlist(list,num):
root=\'{0:^20}\t{1:^20}\t{2:^20}\'
print(root.format(\'序号\',\'价格\',\'商品名称\'))
count = 0
for g in list:
try:
count = count + 1
if count<=num:
print(root.format(count,g[0],g[1]))
except:
print(\'打印错误\')
return \'\'
def main():
goods=input(\'请输入需要查询的商品名称:\')
start_url=\'https://s.taobao.com/search?q=\'+goods
width=eval(input(\'请输入爬取的页码:\'))
num=eval(input(\'请输入爬取的商品数量:\'))
list=[]
for j in range(width):
try:
url=start_url+\'&S=\'+str(44*j)
html = gethtml(url)
perpage(list, html)
except:
continue
printlist(list,num)
main()
参考
[1] https://blog.csdn.net/Guanhai1617/article/details/104120581
[2]《Python网络爬虫与信息提取》http://www.icourse163.org/course/BIT-1001870001