网络抓取:我的Cookie是否在我的请求中“不起作用”?

时间:2019-05-05 13:54:43

标签: python-3.x web-scraping python-requests

我对网页抓取非常陌生。我对Cookie一无所知,这似乎是这里的问题。我正在尝试一些非常简单的方法,即在某个网站上执行request.get(),然后使用Beautiful Soup:

import requests
from bs4 import BeautifulSoup

page = requests.get("https://www.immoweb.be/fr/recherche/maison/a-vendre/brabant-wallon?minprice=100000&maxprice=200000&minroom=3&maxroom=20")
print page
soup = BeautifulSoup(page.content, 'html.parser')
print(soup.prettify())

这基本上是行不通的,因为print(soup.prettify())说:“ 请求失败。封装的事件ID:449001030063484539-234265426366891642

没关系,我发现那是因为我的get需要一些cookie。因此,我使用了here中描述的方法,创建了一个饼干字典,并将其作为我的get参数传递给了我们。

cookies = {'incap_ses_449_150286':'ll/1bp9r6ifi7LPUDiw7Bi/dzlwAAAAAO6OR80W3VDDesKNGYZv4PA==', 'visid_incap_150286':'+Tg7VstMS1OzBycT4432Ey/dzlwAAAAAQUIPAAAAAAAqAettOJXSb8ocwxkzabRx'}
page = requests.get("https://www.immoweb.be/fr/recherche/maison/a-vendre/brabant-wallon?minprice=100000&maxprice=200000&minroom=3&maxroom=20", cookies=cookies)

...现在,print(soup.prettify())打印整个页面,确定。

但是,基本上,如果我关闭计算机,然后在第二天回来,然后再次运行脚本,似乎这些经过硬编码的cookie现在是错误的,因为它们实际上已经更改了,对吗?这就是我观察到的,只是重新运行脚本似乎不再起作用。我想这是正常的“ Cookie行为”,从一天更改为另一天(?)。

因此,我认为我可以在执行request.get()之前自动获取这些内容。所以我这样做了:

session = requests.Session()
response = requests.get("https://www.immoweb.be/fr/recherche/maison/a-vendre/brabant-wallon?minprice=100000&maxprice=200000&minroom=3&maxroom=20")
cookies = session.cookies.get_dict()

执行此操作时,我确实获得了2个cookie(“ incap_ses_449_150286”和另一个),但是它们的值与如果我在网页上使用Chrome的开发人员工具看到的值不同。并将这些cookie传递给我的get()似乎不起作用(尽管我不再有“请求失败”消息,但是print(soup.prettify())几乎没有打印。)要使其正常工作,是通过在dict中手动编码cookie,然后使用Chrome的工具查看它们来实现的。。。我想念什么?

非常感谢! Arnaud

1 个答案:

答案 0 :(得分:0)

这不是Python问题。这是您要连接的Web服务器,具体取决于它允许访问其站点的内容。您的网络浏览器与requests网络浏览器检测到的不同之处在于,它导致它允许一个浏览器并拒绝另一个浏览器。这些Cookie可能存在,因此不必继续进行此检测(Cloudflare?),并且通过将Cookie从Chrome复制到requests来规避它。

您是否尝试过将用户代理设置为Chrome浏览器?另外,请检查网站的robots.txt,以查看是否允许网页抓取工具;可能是网站所有者不希望您这样做。似乎他们已经采取了预防措施。