使用python requests+re库+curl.trillworks.com神器 实现淘宝页面信息爬取
慕课【Python网络爬虫与信息提取】课程随手练习~!
和嵩天老师课程中的示范不同的是,淘宝页面现在不能直接爬取,要修改下访问请求的headers表头信息。
目标:使用python的requests+re库+curl.trillworks.com神器,获取淘宝搜索页面的信息,提取其中的商品名称和价格。
步骤:
1. 导入必要的requests和re库。
2. 使用requests库获取淘宝搜索页面的代码内容,其中使用curl.trillworks.com神器访问页面源码
3. 使用re库对搜索页面中的内容进行搜索匹配,获取想要的商品名称和价格信息
4. 将获取的信息全部打印出来
三点说明:
1. 我们设置的搜索关键词为“书包”,查看淘宝搜索页面源代码,可以看到商品名称是用“raw_title”:" "的格式表示,价格是用“view_price”:" " 的格式表示,参以下截图。
2. requests库+curl.trillworks.com神器访问搜索页面源码
如果用requests库直接访问淘宝页面,get到的text页面信息内容为登录界面代码,无法进行后续的代码逻辑分析。
要解决这个问题,我们需要使用curl.trillworks.com这个神器!
在写爬虫的过程中,经常需要更改添加代码中的表头、cookie参数等信息,手动一一至浏览器中查找添加,效率低!
使用curl.trillworks.com这个网站,可以快速获得需要的信息,一键复制到代码中使用。
首先,我们先用淘宝账号登录淘宝网页,用关键词“书包”搜索后,按F12进入检查,查看network中第一行的信息,会找到Request Headers。如果你的界面中没有这么多请求项,可以按F5刷新。(我这里使用的chrome浏览器)
点击右键,Copy--->Copy as cURL(bash)。点击进入网站:https://curl.trillworks.com。将复制的信息粘贴至“curl command”框内,网页自动在“Python requests”框内生成requests表头和参数信息。
将生成的headers={ } 这块信息复制到我们要编写的代码中,赋值给一个变量,将该变量作为requests.get()的表头参数,这样就可以访问淘宝搜索页面的表头信息了。
3. 实现淘宝搜索页面翻页功能
我们通过观察淘宝页面的网址特点,每个搜索页面44项商品,可以通过初始 url + "&s="+str(44*i)来构建第 i 页的搜索网址。
整个代码:
import requests
import re
def getHTMLText(url):
f_headers = {
'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/72.0.3626.109 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'referer': 'https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cookie': 'thw=cn; cna=rb0wFTyBBWACAd9D45F+NJ1C; v=0; t=4a0ad90ee182147ccecb34c91a67be87; cookie2=1d7429f2302215e53f948412fd8876fd; _tb_token_=fbe1e7e9fe4e5; unb=151865634; sg=14c; _l_g_=Ug%3D%3D; skt=ff183a63b64ff4d1; publishItemObj=Ng%3D%3D; cookie1=Vy1GZfzIwV2xe98odghB3wi3hTCmiAuYAGVSGv%2FSS2M%3D; csg=252c0999; uc3=vt3=F8dByEiS%2F1HtpO89y7s%3D&id2=UoTdcxm32qr5&nk2=AHLWl%2BOuG%2F5MpigN&lg2=V32FPkk%2Fw0dUvg%3D%3D; existShop=MTU1NDYzMjYzOQ%3D%3D; tracknick=charmian_911; lgc=charmian_911; _cc_=Vq8l%2BKCLiw%3D%3D; dnk=charmian_911; _nk_=charmian_911; cookie17=UoTdcxm32qr5; tg=0; enc=xvTaM%2BBFiSIhHwy54c0oru%2F0k5C9X8eV7MIvbvfeMjMIAFLmMWJuf0RSFlU%2FYwBokTG0r%2B6e9qXykPT9Mt1QSA%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; mt=ci=49_1; swfstore=207526; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; uc1=cookie16=V32FPkk%2FxXMk5UvIbNtImtMfJQ%3D%3D&cookie21=VT5L2FSpdet1FS8C2gIFaQ%3D%3D&cookie15=VT5L2FSpMGV7TQ%3D%3D&existShop=false&pas=0&cookie14=UoTZ4Mn4rc4cLA%3D%3D&tag=8&lng=zh_CN; whl=-1%260%260%261554640367388; JSESSIONID=AC6EA814178D724DE2C073B7A64B9196; l=bBjYAFqmv6iohkLsBOCNVuI8ad7tAIRxWuPRwNAvi_5B41L1GFQOlGN8Sep62j5RszTp47HHyQe9-etks; isg=BEFBuVx--TmiZBUN3PZLyYsTUI2bxrUR5rm6x6OWGsinimFc6ry9MJKAbb5p302Y',
}
try:
r = requests.get(url,headers=f_headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def parsePage(ilt, html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1]) #eval去除两端的单引号
title = eval(tlt[i].split(':')[1])
ilt.append([price , title])
except:
print("")
def printGoodsList(ilt):
tplt = "{:4}\t{:8}\t{:16}"
print(tplt.format("序号", "价格", "商品名称"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0], g[1]))
def main():
goods = '书包'
depth = 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)
main()
运行结果: