Google Scrape with Python

时间:2015-09-11 19:55:29

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

我正在尝试学习网页抓取,我正面临着一个怪异的问题......我的任务是搜索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 =&#34; resultStats&#34; < / strong>我发现结果的数量确实是2!

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

**************更新 问题似乎是来自requests.get无法正确处理的自定义日期范围。如果我使用与 selenium 相同的网址,我会得到正确答案

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中打开页面......

1 个答案:

答案 0 :(得分:1)

有几件事导致了这个问题。首先,它希望日期的日期和月份部分为2位数,并且它还期望一些流行浏览器的用户代理字符串。以下代码应该有效:

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