3

我想使用 python 下载一个网页来完成一些网页抓取任务。问题是该网站需要启用 cookie,否则它会提供不同版本的页面。我确实实施了解决问题的解决方案,但我认为它效率低下。需要您的帮助来改进它!

这就是我现在的方式:

import requests
import cookielib

cj = cookielib.CookieJar()
user_agent = {'User-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'}
#first request to get the cookies
requests.get('https://ccirecruit.cox.com/psc/RECRUIT/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL?JobOpeningId=42845&SiteId=1&Page=HRS_CE_JOB_DTL&PostingSeq=1&',headers=user_agent, timeout=2, cookies = cj)
# second request reusing cookies served first time
r = requests.get('https://ccirecruit.cox.com/psc/RECRUIT/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL?JobOpeningId=42845&SiteId=1&Page=HRS_CE_JOB_DTL&PostingSeq=1&',headers=user_agent, timeout=2, cookies = cj)
html_text = r.text

基本上,我创建了一个CookieJar对象,然后针对同一个 URL 发送两个连续的请求。第一次它为我提供了糟糕的页面,但作为补偿给了 cookie。第二个请求重用了这个 cookie,我得到了正确的页面。

问题是:是否有可能只使用一个请求并仍然获得正确的启用 cookie 的页面版本?

我尝试HEAD第一次发送请求而不是GET尽量减少流量,在这种情况下不提供 cookie。谷歌搜索也没有给我答案。因此,了解如何有效地制作它很有趣!有任何想法吗?!

4

2 回答 2

2

您需要发出请求以获取 cookie,所以不,如果不发出两个单独的请求,您将无法获取 cookie 并重用它。如果“启用 cookie”是指将脚本识别为具有 cookie 的版本,那么这一切都取决于服务器,您可以尝试:

  • 在发出第一个请求之前对 cookie 进行硬编码,
  • 请求一些可能的最小页面(具有最小可能的响应但包含 cookie)来获取第一个 cookie,
  • 试图找到一些 walkaroung(也许添加一些 GET 参数会使网站误以为您有 cookie - 但您需要为这个特定网站找到它),
于 2012-11-19T02:05:01.993 回答
2

我认为这里的赢家可能是使用requests'ssession框架,它会为您处理 cookie。

看起来像这样:

import requests
import cookielib

user_agent = {'User-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'}
s = requests.session(headers=user_agent, timeout=2)

r = s.get('https://ccirecruit.cox.com/psc/RECRUIT/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL?JobOpeningId=42845&SiteId=1&Page=HRS_CE_JOB_DTL&PostingSeq=1&')
html_text = r.text

试试看,看看是否有效?

于 2012-11-19T02:57:24.327 回答