Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google Scrape中使用Python的结果数量错误_Python_Python 3.x_Web Scraping_Beautifulsoup_Python Requests - Fatal编程技术网

Google Scrape中使用Python的结果数量错误

Google Scrape中使用Python的结果数量错误,python,python-3.x,web-scraping,beautifulsoup,python-requests,Python,Python 3.x,Web Scraping,Beautifulsoup,Python Requests,我试图学习网页抓取,我面临着一个奇怪的问题。。。我的任务是在谷歌上搜索特定日期范围内某个主题的新闻,并统计结果的数量 我的简单代码是 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=pa

我试图学习网页抓取,我面临着一个奇怪的问题。。。我的任务是在谷歌上搜索特定日期范围内某个主题的新闻,并统计结果的数量

我的简单代码是

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)

我发现结果实际上只有2个,如果我手动下载HTML文件,打开页面源代码并搜索id=“resultStats”,我发现结果的数量确实是2个

有人能帮我理解为什么在保存的HTML文件和汤项目中搜索相同的id标记会导致两个不同的数字结果吗

**************更新 问题似乎是requests.get无法正确处理自定义日期范围。如果我使用与selenium相同的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

为了补充Vikas的答案,谷歌也将无法为某些用户代理使用“自定义日期范围”。也就是说,对于某些用户代理,谷歌将只搜索“最近”的结果,而不是您指定的日期范围

我还没有检测到一个清晰的模式,用户代理将打破自定义日期范围。似乎包括一种语言是一个因素

下面是一些破坏cdr的用户代理的示例:

Mozilla/5.0(Windows;U;Windows NT 6.1;fr-fr)AppleWebKit/533.20.25(KHTML,类似Gecko)版本/5.0.4 Safari/533.20.27


Mozilla/4.0(兼容;MSIE 10.0;Windows NT 6.1;Trident/5.0)

当我搜索没有日期范围的g.news时,我也会得到大约8600条条目。那么,在传递日期参数的代码中似乎有一个无声的错误?不是python人,所以不能推荐调试策略。祝你好运
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