#python版本基于2.7
使用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 requests
import re
先定义好一个主函数main,把各个功能模块化,然后再去编写各个模块的具体代码。
def main():
goods = '手机'
depth = 3 #爬取3页
start_url = 'http://s.taobao.com/search?q=' + goods #爬取商品的url
infoList = [] #初始化一个列表,方便把爬取的键值对添加到里面,然后读取
for i in range(depth): #for循环更新url
try: #处理异常
url = start_url + '&s=' + str(48*i) #每页的url
html = getHTMLText(url) #获取页面信息
parsePage(infoList, html) #解析获取的信息,捕捉商品信息的键值对并且添加到列表中
except:
continue
printGoodsList(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-8
return r.text
except:
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 + 1
print(tplt.format(count, g[0], g[1])) #依次输出序号,价格,商品名称
最后执行主函数:main(),查看结果
以上代码中的eval,split,format方法都很简单,下面给出这三个方法的介绍链接:
eval
split
format
文章到此结束,请各位自行尝试。