python3 单线程和多线程爬虫获取到的结果不一样?

本想把爬虫项目改成多线程,遇到一个问题,就是单线程是可以获取数据,多线程不想不知道怎么改?

单线程跑出来的结果如图:

多线程跑出来的结果如图:

估计是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]

阅读 1.8k
3 个回答

原因
共用会话 ID 导致的,具体过程:
第 1 个线程 get 第 1 页,得到一组 acckey
第 2 个线程 get 第 2 页,得到新的一组 acckey
第 1 个线程使用旧的一组 acckey 发送 post 请求,导致访问失败

解决
改为一个线程一个会话 ID,具体做法:
get_page_data 不要传入 cookies

先禁用自动重定向,不携带 cookies get 搜索页一次,此时会得到状态码 302 和一个会话 ID cookie PHPSESSID
使用这个 PHPSESSID 重新 get 搜索页和发送 post 请求即可

或者不禁用自动重定向,get 搜索页后,通过 .request.headers.get('Cookie') 获取最后重定向请求的 cookie,携带发送 post 请求即可

也可以使用 requests.Session(),它会自动存储和发送会话参数,无需自己操作 cookie

不要共用cookies。每个线程用一个单独的cookie就没啥问题了

试试aiohttp协程库?这样网络部分就不需要多线程/多进程了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题