1.实例分析
定向爬虫可行性:
访问https://www.taobao.com/robots.txt
得User-agent: Baiduspider
Disallow: /
User-agent: baiduspider
Disallow: /
这里对根目录进行限制,但我们仅是拿来学习技术实现,不做商业用途且骚扰。
2.程序结构设计
3.代码实现
关于写headers信息:
1.登录淘宝,进入搜索页,F12
2.选择Network,刷新一下,找到最上方以search?开头的文件,右键copy -> Copy as cURL(bash)
import re
import requests
def getHTMLText(url):
header = {
'user-agent': 'Mozilla/5.0',
'cookie': '自己找',
}#只需要user-agent和cookie就可以,加上其他的信息反而失败。?。
try:
r = requests.get(url,headers=header)
r.raise_for_status()
r.encoding = r.apparent_encoding
print("爬取成功")
return r.text
except:
print("爬取失败")
def parsePage(infolist,html):
try: #通过分析html页面,发现名字和价格的键值对信息,写正则表达式提取
price_list = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html) #\为转义字符,\" 为" ; [\d\.]* 表示所有小数,任取数字或者小数点0或无限次
name_list = re.findall(r'\"raw_title\"\:\".*?\"',html)
for i in range(len(price_list)):
price = eval(price_list[i].split(':')[1]) # eval()去掉“”
name = eval(name_list[i].split(':')[1])
infolist.append([price,name])
except:
print("分析页面异常")
def printGoodsList(infolist):
title = "{0:^10}\t{1:^40}\t{2:^30}"
print(title.format("编号","名字","价格",chr(12288)))
for i in range(len(infolist)):
q = infolist[i]
print(title.format(i+1,q[1],q[0],chr(12288)))
print("共:{}条记录".format(len(infolist)))
if __name__ == '__main__':
goods = "书包"
depth = 2 #页面深度2
start_url = "https://s.taobao.com/search?q="+goods
infolist = []
for i in range(depth):
try:
url = start_url + '&s=' +str(44*i)
html = getHTMLText(url)
parsePage(infolist,html)
except:
continue
printGoodsList(infolist)