forked from ClericPy/Spider_on_Tianmao_and_Taobao
-
Notifications
You must be signed in to change notification settings - Fork 0
/
通过map简化多线程用法的京东爬虫.py
51 lines (40 loc) · 1.84 KB
/
通过map简化多线程用法的京东爬虫.py
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
import requests
''''
自动爬取某单个商品的所有评论内容,因为只是为了演示map用法,所以不再存入json”。
注意:这里使用了一个requests模块,需要去第三方下载,可以通过pip
pip install requests
'''
# ll是用来存放评论内容列表的,其中key是页码,value是存放10个当页评论的列表
ll = {}
pid = '967821'# 商品ID
# 模拟请求头
headers1 = {'GET': '',
'Host': "club.jd.com",
'User-Agent': "Mozilla/5.0 (Windows NT 6.2; rv:29.0) Gecko/20100101 Firefox/29.0",
'Referer': 'http://item.jd.com/{}.html'.format(pid)}
r1 = requests.get(
'http://club.jd.com/productpage/p-{}-s-0-t-3-p-{}.html'.format(pid, 0), headers=headers1)
# 计算最大页码数
maxpagenum = r1.json()['productCommentSummary'][
'commentCount'] // 10
def getrate_jd(pagenum):
global pid # 这里用全局是因为写这个脚本的时候对map不太熟练,其实多参数可以用元组的,但是嫌麻烦,以后可以优化一下
'''该函数用来获取商品ID是pid的第pagenum页的评论列表'''
headers1 = {'GET': '',
'Host': "club.jd.com",
'User-Agent': "Mozilla/5.0 (Windows NT 6.2; rv:29.0) Gecko/20100101 Firefox/29.0",
'Referer': 'http://item.jd.com/{}.html'.format(pid)}
r = requests.get(
'http://club.jd.com/productpage/p-{}-s-0-t-3-p-{}.html'.format(pid, pagenum), headers=headers1)
aa = r.json()
ss = [x['content'] for x in aa['comments']]
global ll
if ss != []:
ll[pagenum] = ss
from multiprocessing.dummy import Pool
pool = Pool(10) # 10线程192条评论用了5秒,测试线程池15和4差距2秒,还好京东不封IP,差距不大可能因为网速
urls = list(range(maxpagenum + 1))
results = pool.map(getrate_jd, urls)
pool.close()
pool.join()
print(ll)