python3爬虫:爬取淘宝商品信息的两种方法

爬取淘宝信息:

1,可用selenium模块与driver Chrome插件自动化模拟爬取。

2, 进行抓包爬取。

下面一一进行介绍并且贴出实现代码。但是在此必须说明一下,因为时间有限,相关模块不懂的还需要自行搜索,在此不做教程解说,只提供分析思路与代码实现过程。

学习博客推荐:https://cuiqingcai.com,
实际上我也是根据此博客学习到了一些知识,也是我参考学习的唯一博客。

自动化模拟爬取

python爬虫的selenium模块是一个可以实现模拟浏览器相关动作,并且可跳过JavaScript动态渲染直接返回其网页源代码的一个自动化测试工具。如下我们需要爬取关键词为MacBook Pro的商品信息,可用它来实现自动翻页并且返回每一页的源代码直接进行相关信息的爬取。

分析过程

下面直接进行分析过程。

首先打开淘宝主页:https://www.taobao.com ,进入其中输入关键词观察一下页面,可以看到下面翻页的一些跳转功能。(以下使用的都是Chrome自带的开发者工具

因为要实现自动翻页的过程,则我们需要查看有关翻页这个功能按钮的源代码是什么样子。其中涉及到了输入框,然后点击旁边的确定按钮。

输入框对应的源代码。

确定按钮对应的源代码。

在知道了以上的一些按钮信息之后我们还需要知道翻页之后目前对应的页数在哪,以便在对应的页数正确之后,可以得到对应页面的源代码,这样可直接运用一些相关的模块进行节点锁定爬取即可。

确定页数码的源代码。

页面上商品信息的html源代码。

为什么要这样分析每一个相关功能的源代码?因为在selenium模块中可以实现自动化的过程,但是需要指定页面上相关的源代码才行,对于selenium来说等于开放了这个功能的接口一样。

思路分析:将要用相关模块挖掘源代码信息做为一个函数,将要爬取的页面源代码做为一个函数,其中实现自动翻页功能,即若是大于1,自动跳到其页面并且返回其页源代码,否则返回第一页页面的源代码。最后代入前者挖掘的函数。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'''
函数目标:
利用selenium的自动翻页进行爬去相关的内容
编写时间:
2018-04-07
'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from pyquery import PyQuery as pq
browser = webdriver.Chrome('/Users/junjieliu/Downloads/小插件/chromedriver')
wait = WebDriverWait(browser, 10)
keys = 'macbookpro'
'''
函数说明:实现自动化翻页。
仅仅当需要时进行翻页的选项
'''
def index_source(page):
print('正在爬取第' + str(page) + '页内容..' + '\n' + '.' * 15)
url = 'https://s.taobao.com/search?q=' + quote(keys)
browser.get(url)
# 果然页数大于1则自动翻页功能启动
if page > 1:
# 输入框定位
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input.input.J_Input')))
# 确定按钮定位
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit')))
# 清理,输入,点击一体化
input.clear()
input.send_keys(page)
button.click()
'''
获取源代码,传入爬取数据的函数
获取源代码过程:
第一步确定为在那一页
第二步确定爬取内容
'''
wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span.num'), str(page)))
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item')))
print('获取本页源码成功,以下为相关的信息:' + '\n')
get_product()
'''
函数说明:
用pyquery爬取其中的商品内容
'''
def get_product():
html_source = browser.page_source
doc = pq(html_source)
items = doc('#mainsrp-itemlist .items .item').items()
'''
以下匹配内容可查看网页源代码可知
'''
for item in items:
product_infos = {
'img_url':'https:' + item.find('.pic .img').attr('data-src'), # 店铺主图片地址
'product_desc':item.find('.pic .img').attr('alt'), # 商品描述
'price':item.find('.price').text().replace('\n', ''), # 价格
'people':item.find('.deal-cnt').text(), # 购买人数
'shop_url':'https:' + item.find('.shop .shopname').attr('href'), # 店铺信息
'shop_name':item.find('.shop').text(), # 店铺名称
'shop_location':item.find('.location').text() # 店铺所在地
}
print(product_infos)
if __name__ == '__main__':
pages = 100 # 根据页面分析可知总共有100页的信息
for num in range(1, pages + 1):
index_source(num)

当然还可以进行正则表达式的匹配来完成爬取,因为需要时间来测试相关的表达式,所以推荐用pyquery这个库来完成爬取工作,相比于使用过的beautiful模块以及正则表达式,我感觉轻松了不少。

抓包爬取

以下的抓包是利用的Chrome浏览器完成的,在这之前说了,因为时间关系,关于抓包是什么就不在此做详细介绍了…相信你看了我下面的分析过程会隐约明白一点。

分析过程

打开淘宝主页,输入关键词,在第一页上打开Chrome自带的开发者工具,这样就可以看到第一页的源代码信息了。以下图过程可以看到我们在第一页抓到的相关的淘宝API的数据包。里面有相关的商品信息,均为json格式。


其中的XHR格式不懂可参考此篇文章:https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest

浏览器新建一个标签页,打开上面的那个地址看看有什么。

经过一系列的测试发现了其中的那个参数bcoffset=是跳转的决定点,更改其值可得到不同的信息。这样我们进行思路分析就一目了然了。

思路分析:传入上面的说的API的URL,根据上面的那个参数的值更改,返回其中的文档信息,即可爬取到商品信息。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
'''
函数说明:
利用抓包返回的信息直接爬取商品信息
编写时间:
2018-04-08
'''
import requests
import re
if __name__ == '__main__':
# 设定爬取100页,实际上还要多...
pages = 100
for num in range(1, pages + 1):
print('开始爬取第' + str(num) + '页内容...' + '\n' + '.' * 10)
url = 'https://s.taobao.com/api?_ksTS=1523191565870_226&callback=jsonp227&ajax=true&m=customized&stats_click=search_radio_all:1&q=macbookpro&p4ppushleft=1,48&ntoffset=4&s=36&imgfile=&initiative_id=staobaoz_20180408&bcoffset=' + str(num) + '&js=1&ie=utf8&rn=5bd3f39c2ca57f21abe4db8ca60ee49f'
# 代理信息
header = {
'cookie': 't=da97f7b09403e3340cd6d50780a9385e; cna=PoshExqPgw0CAQG9KdLV29qM; hng=CN%7Czh-CN%7CCNY%7C156; thw=cn; enc=MuF%2FWOzFnau5EcbgcPck31M%2FMhER8txA4ZnjdZI2Dt8xzHdAr%2FN4f0OsOD%2FUcrNpOZWIfEG0GSbPQ8C4U%2BU70A%3D%3D; mt=ci%3D-1_1; cookie2=1f17bf1dfa8b6cf01c17d0fe7306c672; v=0; _tb_token_=eaefe3a15f0bf; JSESSIONID=0BC0D7637EFFD50CA56F8A8F4E451813; isg=BD09zFTCO5bo0p_z6P-VaFHGTJ_3cnEiA2cTwf-D2RRsNl5oySop_Xqg5Wpwlonk',
'referer': 'https://s.taobao.com/search?q=macbookpro&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20180408&ie=utf8&bcoffset=4&p4ppushleft=1%2C48&ntoffset=4&s=0',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'x-requested-with': 'XMLHttpRequest'}
responed = requests.get(url=url, headers=header)
# 指定编码格式
responed.encoding = 'utf-8'
re_text = responed.text
'''
进入数据清洗与筛选阶段
因为转化json格式始终失败...所以改用正则表达式来进行匹配
'''
print('获取源代码成功,以下为相关商品的信息:')
target = re.findall(r'"raw_title":"(.*?)".*?"pic_url":"(.*?)".*?"view_price":"(.*?)".*?"item_loc":"(.*?)".*?"view_sales":"(.*?)".*?"user_id":"(.*?)".*?"nick":"(.*?)"', re_text, re.S) # @UndefinedVariable
for each in target:
product = {
'shop_title':each[0], # 店铺主题
'pic_url':'https:' + each[1], # 店铺图片地址
'price':each[2], # 价格
'sales_people':each[4], # 购买人数
'shop_name':each[6], # 店铺名称
'loc':each[3], # 店铺所在地
'shop_url':'https://store.taobao.com/shop/view_shop.htm?user_number_id=' + each[5] # 店铺URL地址
}
print(product)

最后

第二种方法期间原本以为可以先转化为json格式来进行处理,没想到发生了json.decoder.JSONDecodeError:的错误,结果改用正则表达式进行文本的挖掘,效率也是无形中得到了提升…在此我推荐用正则表达式来处理json格式的文档,这样在绝大多数情况下可能会有更高的效率!

爬取到的数据可用来进行一些数据分析等等。有时想尝试用各种方法去爬取,但是因为学的东西真的多,所以就不一一尝试了,尽量使用简便的方法…不懂的朋友还需要多多学习,利用好搜索引擎!当然看书也是必须的。

更新

经网友反馈,第二种用后门链接抓包爬取淘宝商品信息的方法已经失效了…在此很遗憾未能尽力帮助到需要的人。

如果以后用得到,我会在此补上新的方法。

---------------本文终---------------

文章作者:刘俊

最后更新:2019年03月28日 - 15:03

许可协议: 转载请保留原文链接及作者。