本想把爬虫项目改成多线程,遇到一个问题,就是单线程是可以获取数据,多线程不想不知道怎么改?
单线程跑出来的结果如图:
多线程跑出来的结果如图:
估计是headers 和cookies 没有传进去,我不知道怎么改,求大佬们指点.
代码截图:
'''
单线程代码
for url in urls:
get_page_data(headers,cookies,url)
'''
多线程代码
with ThreadPoolExecutor(max_workers=5) as executor:
future_to_url = [executor.submit(get_page_data,headers,cookies,url) for url in urls]
for future in as_completed(future_to_url):
print(future.result())
'''
这是我的代码:
[https://github.com/huchiwen/LearnSpider/blob/main/e.py]
原因
共用会话 ID 导致的,具体过程:
第 1 个线程 get 第 1 页,得到一组
acckey
第 2 个线程 get 第 2 页,得到新的一组
acckey
第 1 个线程使用旧的一组
acckey
发送 post 请求,导致访问失败解决
改为一个线程一个会话 ID,具体做法:
get_page_data
不要传入cookies
先禁用自动重定向,不携带
cookies
get 搜索页一次,此时会得到状态码302
和一个会话 ID cookiePHPSESSID
使用这个
PHPSESSID
重新 get 搜索页和发送 post 请求即可或者不禁用自动重定向,get 搜索页后,通过
.request.headers.get('Cookie')
获取最后重定向请求的 cookie,携带发送 post 请求即可也可以使用
requests.Session()
,它会自动存储和发送会话参数,无需自己操作 cookie