问题:使用request库和re库爬取淘宝网某种商品信息,并打印出其名称和价格
分析:
1.确定淘宝网搜索商品网址及robots协议
2.分析实现步骤:
A:使用request库爬取信息
B:使用re库查找信息-findall()函数
C:打印
3.明确实现难点:分页
在确定淘宝网搜索商品网址为:https://s.taobao.com/search?q=?后,通过手动翻页分析url,得知淘宝实现翻页功能是在url后增加id,每页展示固定商品数。
代码:
import requests
import re
import time
def getText(url):
try:
headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'}
r = requests.get(url, headers = headers, timeout = 30)
time.sleep(1.5)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return 'Failed!'
def parserPage(ilt, html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
glt = re.findall(r'\"raw_title\"\:\".*?\"', html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
goods_name = eval(glt[i].split(':')[1])
ilt.append([price, goods_name])
except:
print('')
def printGoodslist(ilt):
tplt = "{:<4}{:<8}{:>20}"
print(tplt.format('序号','价格','商品名称'))
count = 0
for g in ilt:
count += 1
print(tplt.format(count, g[0], g[1]))
def main():
goods = '书包'
depth = 10
start_url = 'https://s.taobao.com/search?q=' + goods
infolist = []
for i in range(depth):
try:
url = start_url + '&s='+str( 44 * i)
html = getText(url)
parserPage(infolist, html)
except:
continue
printGoodslist(infolist)
main()
由于淘宝网robots协议禁止爬取根目录下任何信息,而本人操作仅为技术实现,并非恶意访问,因此在实现过程中,使用headers参数伪造user-agent信息,并使用time.sleep()方法模拟真实用户操作,以免被网站方禁止访问。
在最后main()函数打印中,自定义爬取深度(爬取页面数),使用string的加操作,拼接所有页面url。
re库使用范围非常广,还需要多加熟悉才行。