【问题标题】:Fetching cookie enabled page in python在python中获取启用cookie的页面
【发布时间】:2012-11-06 22:54:36
【问题描述】:

我想使用 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。谷歌搜索也没有给我答案。 因此,了解如何有效地制作它很有趣!有什么想法吗?!

【问题讨论】:

标签: python cookies web-scraping python-requests


【解决方案1】:

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

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

【讨论】:

  • 感谢@Tadeck!实际上,我事先并不知道这些页面,也无法预测他们的行为(使用或不使用 cookie)。因此,在这种情况下,考虑到您的评论,我认为需要 2 个请求。顺便说一句,启用 cookie 的意思是,为了提供正确的页面,他们的服务器会要求 cookie。当我在浏览器中加载示例中列出的页面时,服务器似乎在我看到正确的页面之前与我交换了几条消息。
  • 另外,可能有一种方法可以至少对我的数据库中的所有页面执行这 2 个连续请求?!说一些页面从一开始就为页面服务,但有时我会遇到这个问题。有没有办法从第一个请求中判断页面是否代理?我猜现在,你还怎么想?!
  • @Nick:看起来他们不希望页面被抓取,因此不要让它容易识别。我认为没有通用的方法可以为几个不同的站点识别此类案例。在这种特定情况下,您可以尝试识别差异 - 例如。第一个响应将“respondwithsignonpage”标头设置为“true”,您可以将其用于检查。但是,这是非标准 HTTP 标头,您很可能在其他网站上找不到它。
  • 谢谢你,@Tadeck!我同意你的看法。我已经在比较提供的文件之间的差异,只是为了看看这种情况的百分比是多少。不要以为这些很丰富。
【解决方案2】:

我认为这里的赢家可能是使用 requestssession 框架,它会为您处理 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

试试看是否有效?

【讨论】:

  • 不,@jdotjdot,它不起作用。原因是 session 也需要有第一次交互来更新 cookie。在这种情况下仍然需要两个请求。不过感谢您的努力!
  • 是的,我什至再次尝试使用s.head(...),但也没有用。有点奇怪的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2020-10-09
  • 2016-04-23
  • 2021-01-27
  • 2014-12-15
相关资源
最近更新 更多