2013-03-21 21 views
7

Tworzę skrobaczkę do różnych serwisów informacyjnych, dla Nytimes i The Guardian było to łatwe, ponieważ mają one własne API.web scraping google news z pythonem

Teraz chcę zdrapać wyniki z tej gazety GulfTimes.com. Nie udostępniają zaawansowanego wyszukiwania w swojej witrynie, więc uciekłem się do wiadomości Google. Jednak Google News Api jest przestarzałe. Chcę uzyskać liczbę wyników wyszukiwania zaawansowanego, takich jak słowo kluczowe = "Egipt" i begin_date = "10/02/2011" oraz end_date = "10/05/2011".

Jest to wykonalne w Google News UI po prostu przez umieszczenie źródła jako "Gulf Times" oraz odpowiedniego zapytania i daty, po prostu licząc ręcznie liczbę wyników, ale kiedy próbuję to zrobić przy użyciu Pythona, otrzymuję 403 błąd, który jest zrozumiały.

Każdy pomysł, jak to zrobić? A może jest inna usługa poza wiadomościami Google, które pozwolą mi to zrobić? Mając na uwadze, że będę wydawał prawie 500 żądań na raz.

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

To będzie znacznie bardziej przydatna, jeśli podasz żadnego kodu napisałeś do tej pory. Dzięki. – alecxe

+0

Dodałem tylko prosty kod startowy. –

Odpowiedz

11

można wykorzystywać niesamowite requests Biblioteka:

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) 

a dostaniesz status_code = 200.

I, przy okazji, spójrz na projekt scrapy. Nic nie sprawia, że ​​skrobanie przez Internet jest prostsze niż to narzędzie.

+0

Dziękuję bardzo za szybką odpowiedź. Zauważyłem jednak, że ramy czasowe tak naprawdę nie działają i otrzymuję najnowsze wyniki, które wspominają to zapytanie. Każdy pomysł, dlaczego? –

+0

Wystąpił błąd w formacie, przepraszam. Zaktualizowałem kod, proszę spojrzeć. Btw, myślę, że wyraźniej będzie zdefiniować słownik 'params', a następnie jego elementy z' & 'podczas formatowania adresu URL. – alecxe

+0

To nadal nie działa, czy uważasz, że parametry daty nie są już obsługiwane? –

1

hi można złom tak łatwy sposób

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