2013-03-21 4 views
7

Я создаю веб-скребок для разных магазинов новостей, для Nytimes и Guardian это было легко, так как они имеют свой собственный API.web scraping google news with python

Теперь я хочу получить результаты этой газеты GulfTimes.com. Они не предоставляют расширенный поиск на своем веб-сайте, поэтому я прибегал к новостям Google. Однако новости Google Api устарели. Я хочу получить количество результатов расширенного поиска, например ключевое слово = «Египет» и begin_date = «10/02/2011» и end_date = «10/05/2011».

Это возможно в пользовательском интерфейсе Google News, просто добавив источник как «Gulf Times» и соответствующий запрос и дату, и просто подсчитав количество результатов вручную, но когда я попытаюсь сделать это с помощью python, я получаю 403 ошибка, которая понятна.

Любая идея о том, как я буду это делать? Или есть еще одна услуга помимо новостей Google, которая позволила бы мне это сделать? Помня о том, что я бы выпустил сразу почти 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() 
+2

Это будет гораздо более полезным, если вы предоставляете любой код, который вы написали до сих пор. Благодарю. – alecxe

+0

Я добавил только простой стартовый код. –

ответ

11

Вы можете использовать удивительную 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. Ничто не делает веб-соскабливание более простым, чем этот инструмент.

+0

Большое спасибо за быстрый ответ. Тем не менее, я заметил, что временные рамки на самом деле не работают, я получаю последние результаты, ссылающиеся на этот запрос. Любая идея почему? –

+0

Произошла ошибка в формате, извините. Я обновил код, пожалуйста, взгляните. Кстати, я думаю, что будет более понятно определить словарь params', а затем это элементы с '&' при форматировании url. – alecxe

+0

Он по-прежнему не работает, вы считаете, что параметры даты больше не поддерживаются? –

1

привет вы можете отказаться, как это с легким способом

from bs4 import BeautifulSoup 
import requests 

url="https://news.google.co.in/" 
code=requests.get(url) 
soup=BeautifulSoup(code.text,'html5lib') 
for title in soup.find_all('span',class_="titletext"): 
print title.text