我正在为不同的新闻媒体创建一个网络抓取工具,对于纽约时报和卫报来说这很容易,因为他们有自己的 API。
现在,我想从这份报纸 GulfTimes.com 中抓取结果。他们的网站不提供高级搜索,所以我求助于谷歌新闻。但是,Google 新闻 Api 已被弃用。我想要的是从高级搜索中检索结果的数量,例如关键字 =“埃及”和 begin_date="10/02/2011"和 end_date="10/05/2011"。
这在 Google News UI 中是可行的,只需将源作为“海湾时报”和相应的查询和日期,然后简单地手动计算结果的数量,但是当我尝试使用 python 执行此操作时,出现 403 错误这是可以理解的。
关于如何执行此操作的任何想法?或者除了谷歌新闻之外还有其他服务可以让我这样做吗?请记住,我会同时发出近 500 个请求。
import json
import urllib2
import cookielib
import re
from bs4 import BeautifulSoup
def run():
Query = "Egypt"
Month = "3"
FromDay = "2"
ToDay = "4"
Year = "13"
url='https://www.google.com/search?pz=1&cf=all&ned=us&hl=en&tbm=nws&gl=us&as_q='+Query+'&as_occt=any&as_drrb=b&as_mindate='+Month+'%2F'+FromDay+'%2F'+Year+'&as_maxdate='+Month+'%2F'+ToDay+'%2F'+Year+'&tbs=cdr%3A1%2Ccd_min%3A3%2F1%2F13%2Ccd_max%3A3%2F2%2F13&as_nsrc=Gulf%20Times&authuser=0'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
request = urllib2.Request(url)
response = opener.open(request)
htmlFile = BeautifulSoup(response)
print htmlFile
run()
最佳答案
你可以使用 awesome requests图书馆:
import requests
URL = 'https://www.google.com/search?pz=1&cf=all&ned=us&hl=en&tbm=nws&gl=us&as_q={query}&as_occt=any&as_drrb=b&as_mindate={month}%2F%{from_day}%2F{year}&as_maxdate={month}%2F{to_day}%2F{year}&tbs=cdr%3A1%2Ccd_min%3A3%2F1%2F13%2Ccd_max%3A3%2F2%2F13&as_nsrc=Gulf%20Times&authuser=0'
def run(**params):
response = requests.get(URL.format(**params))
print response.content, response.status_code
run(query="Egypt", month=3, from_day=2, to_day=2, year=13)
你会得到 status_code=200。
还有,顺便说一句,看看scrapy项目。没有什么比这个工具更简单的网络抓取了。
关于python - 用 python 抓取谷歌新闻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15550655/