本文所实现的爬取淘宝商品信息将实现以下功能: 对于某个类别的淘宝商品的页面
image.png
爬取这个商品名称,比如“手机”搜索结果下的每个商品的信息,存储到数据结构中,并能将其输出显示。
如下的输出形式:
image.png
接下来,就看我们如何一步步实现这个小爬虫的吧
首先分析搜索接口, 很容易我们就可以发现,
image.png
https://s.taobao.com/search?q=后面接我们的搜索词就可以
我们再研究翻页处理: 第二页
image.png
第三页
我们可以发现,s参数指定了搜索页的跳转,每48条记录一次页面跳转。
有同学可能发现还会有其他很多的参数,这个我们先忽略,我们直接构造一个url,只包括搜索词和搜索页,看看能不能访问到正确页面: 比如 https://s.taobao.com/search?q=手机&s=48
我们将上述地址放到地址栏
发现可以正确访问,所以我们现在就已经知道了如何确定访问接口
主要有三步
首先我们对于上面研究出的搜索接口给出基本的代码:
#CrowTaobaoPrice.py
import requests
import re
def getHTMLText(url):
def parsePage(ilt, html):
def printGoodsList(ilt):
def main():
goods = '手机'
depth = 3
start_url = 'https://s.taobao.com/search?q=' + goods
infoList = []
for i in range(depth):
try:
url = start_url + '&s=' + str(48*i)
html = getHTMLText(url)
parsePage(infoList, html)
except:
continue
printGoodsList(infoList)
main()
对于获取页面源码的函数,我们已经写过很多次了,就是利用requets库抓取页面
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
这个爬虫最核心的地方就在于对商品信息的获取,我们首先分析页面的源代码,我们搜索第一个商品的名字
image.png
基本上所有商品的信息,名称,价格,月销量都在这段数据结构里显示,是嵌入在js代码里的,所以我们就无法用bs4库来提取。 但我们可以直接用re库,正则表达式提取。 因为我们可以发现,所有的商品名称都是 “title”:" "的格式,我们可以搜索确认一下:
我们搜索发现,正好是48条记录,也就是48个商品的信息,所以直接匹配就可以把所所有商品名称信息提取出来,是不是很简单。 对于商品价格 和月销量也是这么获取的
def parsePage(ilt, html):
try:
plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"title\"\:\".*?\"',html)
mslt = re.findall(r'\"month_sales\"\:\"[\d\.]*\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
monthsales = eval(mslt[i].split(':')[1])
ilt.append([price , title, monthsales])
except:
print("")
#CrowTaobaoPrice.py
import requests
import re
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def parsePage(ilt, html):
try:
plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"title\"\:\".*?\"',html)
mslt = re.findall(r'\"month_sales\"\:\"[\d\.]*\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
monthsales = eval(mslt[i].split(':')[1])
ilt.append([price , title, monthsales])
except:
print("")
def printGoodsList(ilt):
tplt = "{:4}\t{:8}\t{:16}\t{:16}"
print(tplt.format("序号", "价格", "商品名称","月销量"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0], g[1],g[2]))
def main():
goods = '手机'
depth = 3
start_url = 'https://s.taobao.com/search?q=' + goods
infoList = []
for i in range(depth):
try:
url = start_url + '&s=' + str(48*i)
html = getHTMLText(url)
parsePage(infoList, html)
except:
continue
printGoodsList(infoList)
main()
结果:
小伙伴也可以更改这个程序去搜索各种不同的商品的信息啦