功能描述
目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格。
技术路线:requests re
程序的结构设计
步骤1:提交商品搜索请求,循环获取页面步骤2:对于每个页面,提取商品名称和价格信息步骤3:将信息输出到屏幕上
核心操作:
浏览器获取cookie和user-agent信息,设置成kv键值对当做请求头参数header放入requests.get()方法中
在html页面中找到商品名称和价格信息对应的键值对,并使用相应的正则表达式与之匹配,在进行搜索
搜索到匹配的字符串后,需要用eval()和split()函数对其进行去引号处理和切割,并通过索引将其取出来,存入商品列表中
输出模板,使用format()函数
设置depth变量的for循环实现翻页爬取
爬取时需要模拟淘宝登录信息
#cookie的获取方法:
打开淘宝商品页面,登录你的淘宝账号——F12进入浏览器的开发者调试工具,点击Network,重新刷新页面——选择最上面的search?initiative_id=…的dos文件——找到Request Headers,复制里面的cookie内容,这样,你就能够获得你的cookie了
发起请求的函数
需要使用开发者工具获得浏览器cookies信息
导库
import requestsimport re
def gethttptext(url):try:kv = {'cookie':####, 'user-agent':'Mozilla/5.0'}r=requests.get(url,headers=kv,timeout=30)r.raise_for_status()r.encoding=r.apparent_encodingreturn r.textexcept:print("提取失败")
从html中解析出商品信息,存入商品列表中(核心)
知识点:
1.正则表达式:浏览器观察爬取的页面html源码,发现商品名和价格都存在特定的key:value键值对中,所以需要用re库的findall方法+正则表达式来寻找所有能匹配
2.eval()函数去除字符串两边的引号
3.plt、rlt返回的都是一个原始的List,需要切分,然后按条件存取到列表ilt中
def parsePage(ilt,html):try:plt = re.findall(r'"view_price":"[\d.]*"',html)rlt = re.findall(r'"raw_title":".*?"',html)print('爬取成功!')for i in range(len(plt)):price = eval(plt[i].split(':')[1])name = eval(rlt[i].split(':')[1])ilt.append([price,name])#print(ilt[i])except:print("解析错误")
将商品输出到屏幕上
运用到format函数
def printgoodslist(ilt):tplt = "{:4}\t{:10}\t{:10}\t"print(tplt.format('序号','价格','商品名称'))for i in range(len(ilt)):print(tplt.format(i,ilt[i][0],ilt[i][1]))
主函数
设置一个变量depth表示爬取页面数量
通过for循环设置翻页
每个循环仍然需要try…except…语句
最后打印所有商品列表
if __name__=="__main__":goods='口红'depth=10start_url='/search?q='+goodsinfolist=[]# depth变量实现翻页处理for i in range(depth):try:url=start_url+'&s='+str(44*i)html=gethttptext(url)parsePage(infolist,html)except:continueprintgoodslist(infolist)