我正在尝试学习网页抓取功能,但遇到了一个怪异的问题……我的任务是在特定日期范围内搜索Google上某个主题的新闻,然后计算结果数。
我的简单代码是
import requests, bs4 payload = {'as_epq': 'James Clark', 'tbs':'cdr:1,cd_min:1/01/2015,cd_max:1/01/2015','tbm':'nws'} r = requests.get("https://www.google.com/search", params=payload) soup = bs4.BeautifulSoup(r.text) elems = soup.select('#resultStats') print(elems[0].getText())
我得到的结果是
About 8,600 results
因此,显然所有的工作都可以…除了结果是错误的事实之外。如果我在Firefox中打开URL(可以使用r.url获取完整的URL)
https://www.google.com/search?tbm=nws&as_epq=James+Clark&tbs=cdr%3A1%2Ccd_min%3A1%2F01%2F2015%2Ccd_max%3A1%2F01%2F2015
我看到结果实际上 只有2个 ,如果我手动下载HTML文件,打开页面源并搜索 id =“ resultStats”, 我发现结果的数量确实是2个!
有人可以帮助我理解为什么在保存的HTML文件和汤中搜索相同的id标签会导致两个不同的数值结果吗?
**更新似乎问题出在自定义日期范围,requests.get无法正确处理该日期范围。如果我对 硒 使用相同的URL,我会得到正确的答案
from selenium import webdriver driver = webdriver.Firefox() driver.get(url) content = driver.page_source soup = bs4.BeautifulSoup(content) elems = soup.select('#resultStats') print(elems[0].getText())
答案是
2 results (0.09 seconds)
问题在于这种方法似乎比较麻烦,因为我需要在Firefox中打开页面…
造成此问题的原因有几方面。首先,它希望日期的日期和月份部分用两位数表示,并且还期望某些流行浏览器的用户代理字符串。以下代码应该工作:
import requests, bs4 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" } payload = {'as_epq': 'James Clark', 'tbs':'cdr:1,cd_min:01/01/2015,cd_max:01/01/2015', 'tbm':'nws'} r = requests.get("https://www.google.com/search", params=payload, headers=headers) soup = bs4.BeautifulSoup(r.content, 'html5lib') print soup.find(id='resultStats').text