100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python爬虫入门实例五之淘宝商品信息定向爬取(优化版)

Python爬虫入门实例五之淘宝商品信息定向爬取(优化版)

时间:2021-01-17 07:30:01

相关推荐

Python爬虫入门实例五之淘宝商品信息定向爬取(优化版)

文章目录

写在前面一、爬取原页面二、编程思路1.功能描述2.程序的结构设计三、编程过程1.解决翻页问题2.编写getHTMLText()函数3.编写parsePage()函数(1).内容解析编程思路(2).函数代码4.编写printGoodsList()四、完整代码引用源自

写在前面

这个例子是笔者今天在中国大学MOOC(嵩天 北京理工大学)上学习的时候写下来的。但是很快写完之后我就发现不对劲,因为照着老师的代码写完后运行并不能爬取到信息,经过我的一番折腾,基本解决了问题,并且做了一些优化,写这篇博客记录一下,下图是最终的爬取结果。

一、爬取原页面

爬取页面为淘宝网站,以女装为例,原图如下,由于淘宝商品排名实时更新,所以爬取结果顺序与网站顺序可能会存在不同。本实例爬取的内容为商品的价格和名称,并为其添加序号。

二、编程思路

这一部分嵩天老师在课中给出了讲解,这里我整理分享给大家。

1.功能描述

目标:获取淘宝搜索页面的信息,提取其中的名称和价格。

理解:

(1).获得淘宝的搜索接口

(2).对翻页的处理

技术路线:requests-re

2.程序的结构设计

步骤一:提交商品搜索请求,循环获取页面

步骤二:对于每个页面,提取商品名称和价格信息

步骤三:将信息输出到屏幕上

对应上述三个步骤分别定义三个函数:

(1)getHTMLText()获得页面

(2)parsePage()对每一个获得的页面进行解析

(3)printGoodsList()将商品的信息输出到屏幕上

三、编程过程

1.解决翻页问题

首先我们来看一下前三页分别的URL

对淘宝每一页商品数量的观察我们可以发现,每一页有44个商品,结合上面的结果我们可以猜测,变量s表示的是第二页,第三页…页的起始商品的编号。基于这种规则,我们就可以构建不同页的URL链接。

代码如下:

for i in range(depth):#对每次翻页后的URL链接进行设计url = start_url + '&s='+str(44*i)html = getHTMLText(url)parsePage(infoList,html)

2.编写getHTMLText()函数

def getHTMLText(url):#获得页面try:kv = {'user-agent': 'Mozilla/5.0','cookie':' '#请自行获取}r = requests.get(url,headers=kv,timeout = 30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:print("获取页面失败")

关于cookie的获取方法,可以参考我的这篇博客

链接: /weixin_44578172/article/details/109353017.

3.编写parsePage()函数

(1).内容解析编程思路

首先查看女装搜索结果页面的源代码

通过对源代码的观察我们发现,淘宝中所有商品的价格和名称是存在相应的键值对中的即:“view_price”:“价格”,“view_title”:“名称”。所以我们想要获得这两个信息,只需要在获得的文本中检索到view_price和view_title并把后续的相关内容提取出来即可,这里采用正则表达式的方法。

(2).函数代码

def parsePage(ilt,html):#对每一个获得的页面进行解析#两个变量分别是结果的列表类型和相关的HTML页面的信息try:re1 = pile(r'\"view_price\"\:\"[\d\.]*\"')#编译商品价格正则表达式re2 = pile(r'\"raw_title\"\:\".*?\"')#编译商品名称正则表达式plt = re1.findall(html)tlt = re2.findall(html)#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])#去掉view_price字段,只要价格部分,eval将获取到的最外层/内层的单引号或双引号去掉title = eval(tlt[i].split(':')[1])#去掉raw_title字段,只要名称部分ilt.append([price,title])except:print("网页解析失败")

4.编写printGoodsList()

def printGoodsList(ilt):#将商品的信息输出到屏幕上try:tplt = "{:4}\t{:8}\t{:16}" #定义打印模板print(tplt.format("序号","价格","商品名称"))count = 0for s in ilt:count = count + 1print(tplt.format(count,s[0],s[1]))except:print("输出失败")

四、完整代码

'''功能描述目标:获取淘宝搜索页面的信息,提取其中的名称和价格。理解:1.获得淘宝的搜索接口2.对翻页的处理技术路线:requests-re程序的结构设计步骤1:提交商品搜索请求,循环获取页面步骤2:对于每个页面,提取商品名称和价格信息步骤3:将信息输出到屏幕上'''import requestsimport redef getHTMLText(url):#获得页面try:kv = {'user-agent': 'Mozilla/5.0','cookie':' '#请自行获取}r = requests.get(url,headers=kv,timeout = 30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:print("获取页面失败")def parsePage(ilt,html):#对每一个获得的页面进行解析#两个变量分别是结果的列表类型和相关的HTML页面的信息try:re1 = pile(r'\"view_price\"\:\"[\d\.]*\"')#编译商品价格正则表达式re2 = pile(r'\"raw_title\"\:\".*?\"')#编译商品名称正则表达式plt = re1.findall(html)tlt = re2.findall(html)#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])#去掉view_price字段,只要价格部分,eval将获取到的最外层/内层的单引号或双引号去掉title = eval(tlt[i].split(':')[1])#去掉raw_title字段,只要名称部分ilt.append([price,title])except:print("网页解析失败")def printGoodsList(ilt):#将商品的信息输出到屏幕上try:tplt = "{:4}\t{:8}\t{:16}" #定义打印模板print(tplt.format("序号","价格","商品名称"))count = 0for s in ilt:count = count + 1print(tplt.format(count,s[0],s[1]))except:print("输出失败")def main():goods = input("请输入想要搜索的商品:") #定义搜索关键词变量depth = input("请输入想要搜索商品的深度(整数):") #定义爬取的深度即页数depth = int(depth)start_url = '/search?q='+goodsinfoList = [] #定义整个的输出结果变量for i in range(depth):#对每次翻页后的URL链接进行设计try:url = start_url + '&s='+str(44*i)html = getHTMLText(url)parsePage(infoList,html)except:continueprintGoodsList(infoList)#调用主函数main()

本篇完,如有错误欢迎指出~

引用源自

中国大学MOOC Python网络爬虫与信息提取/course/BIT-1001870001

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。