200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > python爬虫学习实践(一):requests库和正则表达式之淘宝爬虫实战

python爬虫学习实践(一):requests库和正则表达式之淘宝爬虫实战

时间:2020-05-17 11:09:10

相关推荐

python爬虫学习实践(一):requests库和正则表达式之淘宝爬虫实战

使用requests库是需要安装的,requests库相比urllib 库来说更高级方便一点,同时与scrapy相比较还是不够强大,本文主要介绍利用requests库和正则表达式完成一项简单的爬虫小项目----淘宝商品爬虫。

有关于更多requests库的使用方法请参考:官方文档

第一步:我们先打开淘宝网页

然后搜索你想爬取的商品信息,比如:“手机”。然后可以看到各个商品的“商品名称”、“商品价格”。我们可以爬取手机的名称和价格,从而达到“货比三家”的功能。

第二步:鼠标右键点击网页的空白处,选中“查看页面源代码”,从页面源代码中获取商品名称和商品价格对应的字典中的key值,从而利用正则表达式来爬取所有商品的信息。

鼠标选中“查看页面源代码”后,会出现以下页面:

HTML格式的源代码,为了查找商品名称和商品价格对应的标签,也就是字典中的key,我们可以直接复制淘宝某一个商品的名称或者价格信息,在页面源代码中查找相对应的信息。不同的浏览器中,按Ctrl+F键可进入查找模式。

现在复制粘贴其中一个商品的名称信息“荣耀 荣耀9青春版”,得到如下结果:

可以发现其中的键值对,“title”是“荣耀 荣耀9青春版”的key,现在我们就得到了商品名称所对应的标签,同样的方法可以查找出商品价格对应的标签,这里就不过多阐述,直接给出:

现在得到了商品名称和价格对应的标签:“title”和“price”。

如果这样进行爬虫的话,只能爬取一个网页中的商品,如果我们还想爬第二页,第三页就要寻找其中每翻一次页中的网址对应的变化信息。

先来看看淘宝“手机”商品中第二页和第三页中的网址变化信息。

第二页:

第三页:

我们看到,无论是第二页第三页,只有最后的“&s=**”部分不一致,同时第二页对应的s=48,第三页对应的s=96,可以推测出第i页的s=48*(i-1),我们只需要把这个url添加到我们的爬取程序上,用for循环实现这个url的更新即可。

第三步:进入编写实例

这里用python语言编写程序实现爬虫功能。

由于需要用到正则表达式和requests库,所以先引入。

import requestsimport re

先定义好一个主函数main,把各个功能模块化,然后再去编写各个模块的具体代码。

def main():goods = '手机'depth = 3 #爬取3页start_url = '/search?q=' + goods #爬取商品的urlinfoList = [] #初始化一个列表,方便把爬取的键值对添加到里面,然后读取for i in range(depth): #for循环更新urltry: #处理异常url = start_url + '&s=' + str(48*i) #每页的urlhtml = getHTMLText(url) #获取页面信息parsePage(infoList, html) #解析获取的信息,捕捉商品信息的键值对并且添加到列表中except:continueprintGoodsList(infoList) #打印列表中的键值对信息

主函数写完了,我们把各功能的模块具体化。

首先是getHTMLText()函数,获取url页面的信息文本:

def getHTMLText(url):try:r = requests.get(url, timeout=30) #get方法请求url链接,如果超过30秒没有响应就退出r.raise_for_status() #状态码,如果是200则请求成功r.encoding = r.apparent_encoding #将编码方式更改为捕捉到的内容的编码方式,中文网页一般utf-8return r.textexcept:return ""

然后是parsePage( )函数,解析页面信息,将商品名称和商品价格组合成一对键值对,然后添加到列表里。需要用到正则表达式。

def parsePage(ilt, html):try:plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html) #finfall功能将所有的value数字整合在plt列表tlt = re.findall(r'\"title\"\:\".*?\"',html) #将所有title的value整合在tlt列表for i in range(len(plt)): #基于列表plt的长度使用for循环price = eval(plt[i].split(':')[1]) #split用“:”切割key和value;eval可以转化格式title = eval(tlt[i].split(':')[1])ilt.append([price , title]) #将商品的价格和名称作为键值对添加到ilt列表except:print("")

最后是打印函数printGoodsList( ),输出爬取的结果:

def printGoodsList(ilt):tplt = "{:4}\t{:8}\t{:16}"tplt2 = "{:8}\t{:16}\t{:14}"print(tplt2.format("序号", "价格", "商品名称")) #格式化输出函数count = 0 #序号for g in ilt:count = count + 1print(tplt.format(count, g[0], g[1])) #依次输出序号,价格,商品名称

最后执行主函数:main(),查看结果

序号名称 价格 1896小米 红米5 Plus21013 魅族 魅蓝S6 31374 vivo Y75 41385 华为 畅享7S 5746小米 红米562696 荣耀 V1071323 荣耀 畅玩7X 85661 苹果 iPhone 8 Plus 97219 苹果 iPhone X105226 苹果 iPhone 8111752 小米 Note3 124514 华为 Mate 10 Pro 132998 vivo X20 141942 vivo X9s 152144 荣耀 荣耀9163776 华为 Mate 10174971 苹果 iPhone 7 Plus182144 小米 小米手机6 191163 小米 5X 202883 小米 MIX2 21560小米 红米5A 22796华为 畅享723954荣耀 V9 PLAY242794 一加手机5T252904 华为 P10264184 苹果 iPhone 7274500 三星 Galaxy S8 285452 三星 Galaxy Note8 29903魅族 魅蓝note6304606 三星 Galaxy S8+ 31584小米 红米Note 5A 321394 360手机 N6 Pro 331104 华为 畅享7 Plus341192 vivo Y66i 352230 荣耀 V9 361830 锤子 坚果Pro 2371274 小米 Max2 383298 vivo X20Plus 391392 诺基亚 诺基亚 6 第二代 40737荣耀 畅玩6A 413299 OPPO R11s Plus 423371 美图 T8s43534小米 红米4A 441815 魅族 PRO7 451086 荣耀 荣耀8青春版 462099 OPPO A79 47791小米 红米Note 4X 481932 华为 麦芒6491987 vivo Y79 502524 努比亚 Z17 511299 OPPO A57 52691魅族 魅蓝6531226 努比亚 Z17 mini 545308 美图 V6 55736魅族 魅蓝note5561699 OPPO A73 572202 美图 M8 583281 华为 P10 Plus59829360手机 N6 Lite 601226 荣耀 荣耀9青春版 611474 诺基亚 诺基亚7 622546 华为 NOVA 2S631073 锤子 坚果Pro 642653 美图 M8S651592 华为 NOVA 2 66597荣耀 畅玩667761华为 畅享6S 683186 华为 Mate 9 Pro 692663 华为 Mate 9 703770 索尼 Xperia XZ Premium711399 OPPO A83 72773魅族 魅蓝E2 732843 OPPO R11s 742100 三星 Galaxy C9 Pro752257 魅族 PRO7 Plus 761028 荣耀 畅玩6X 77651魅族 魅蓝5s 781326 华为 NOVA 青春版792223 vivo X9s Plus 802807 努比亚 Z17S 812900 美图 T8 821109 360手机 N6 83657小米 红米4X 841117 vivo Y66 851668 魅族 PRO 6 Plus 86543天语 X1187150诺基亚 新105 881083 华为 NOVA 892077 华为 NOVA 2 PLUS 903435 vivo Xplay6911883 vivo X9 92194创星 S1 933041 索尼 Xperia XZ1 94859vivo Y53 95171波导 A520 961412 vivo Y67 97935vivo Y55 982563 小米 MIX992355 OPPO R11 1001966 小米 Note 2 1011402 魅族 PRO 6S 102537魅族 魅蓝 A5 1032360 谷歌 Pixel XL104175纽曼 F9 1052499 金立 M7 106398誉品 5A 1071988 vivo X9Plus1081999 金立 S101092036 OPPO R9S 1101275 荣耀 荣耀81111646 小米 5S 1122092 OPPO R9s Plus 113677华为 畅享61141089 360手机 N5s 1151752 苹果 iPhone SE 1164590 HTC U11+ 117437誉品 I7S118387索野 7S 1192996 黑莓 KEYone 15纽曼 M560 1211172 酷派 Cool S11223888 中兴 天机Axon M123899小辣椒 红辣椒S6 1241735 努比亚 Z17miniS 1251260 OPPO A59S 1261750 三星 Galaxy C8 1279730 三星 SM-W128897欧加 S11 Plus1292999 欧奇 OKP6 PRO130892魅族 魅蓝X1313358 vivo X20Plus屏幕指纹版1323864 HTC U11 133583魅族 魅蓝5134112小辣椒 G108 1351266 华为 MATE8 1363299 HTC U11 EYEs 137737360手机 VIZZA1381767 三星 Galaxy S7 edge13995天语 T2 140202创星 R9 1411791 小米 5s Plus1422603 三星 Galaxy S7 1432633 一加手机5 1441599 金立 大金钢2

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