python爬虫实例讲解
1.爬取网页
通过导入request,re库,首先编写一个将淘宝商品页爬取的函数,此时一个注意点是要将自己头部的user agent伪装成浏览器(淘宝会拒绝爬虫请求),并且采用设计好的cookie,放入request.get的参数中,返回网页信息。`
import requests
import re
def get_html_text(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} #爬虫头部伪装成浏览器头部,方便get到url
try:
coo = 't=85db5e7cb0133f23f29f98c7d6955615; cna=3uklFEhvXUoCAd9H6ovaVLTG; isg=BM3NGT0Oqmp6Mg4qfcGPnvDY3-pNqzF2joji8w9SGWTYBu241_taTS6UdFrF3Rk0; miid=983575671563913813; thw=cn; um=535523100CBE37C36EEFF761CFAC96BC4CD04CD48E6631C3112393F438E181DF6B34171FDA66B2C2CD43AD3E795C914C34A100CE538767508DAD6914FD9E61CE; _cc_=W5iHLLyFfA%3D%3D; tg=0; enc=oRI1V9aX5p%2BnPbULesXvnR%2BUwIh9CHIuErw0qljnmbKe0Ecu1Gxwa4C4%2FzONeGVH9StU4Isw64KTx9EHQEhI2g%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; mt=ci=0_0; hibext_instdsigdipv2=1; JSESSIONID=EC33B48CDDBA7F11577AA9FEB44F0DF3'
cookies = {}
for line in coo.split(';'): # 浏览器伪装 同样是为了成功爬取页面
name, value = line.strip().split('=', 1)
cookies[name] = value
r = requests.get(url, cookies=cookies, headers=headers, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ''
2. 正确获得我们需要的信息(爬虫关键)
我们通过观察网页源代码找到商品与价格位于view price和raw title之后,利用导入的re库我们使用正则表达式表示出我们想要爬取的部分,再用split函数去掉列表前面的定位词(view price,raw title),并用appen函数讲列表两个元素商品和价格封装好。
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])
title=eval(tlt[i].split(":")[1])
ilt.append([price,title])
except:
print("")
3.调用输出函数以及编写主函数
输出时候我们先设计个美观的表格格式tplt,然后以他为format进行输出,通过count给他加上序号。主函数很简单,调用上面编写的函数即可。
注意:url翻页功能的实现就是观察淘宝翻页时候url的变化来编写翻页的小循环,depth代表翻的页数,44是淘宝每个页面呈现的商品数量,第一页s=0,第二页s=44,以此类推,这里仅爬了前两页。
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]))
print("")
def main():
goods="书包"
depth=2
start_url="https://s.taobao.com/search?q="+goods
info_list = []
for i in range(depth):
try:
url = start_url + '&s=' + str(44 * i) # 44是淘宝每个页面呈现的宝贝数量
html = get_html_text(url)
parsePage(info_list, html)
except:
continue
printGoodsList(info_list)
main()