0

Fortsetzung auf vorherige Arbeit, um alle News-Ergebnisse über Abfrage zu crawlen und Titel und URL zurückzugeben, verfeinere ich den Crawler, um alle Ergebnisse von allen Seiten in Google News zu erhalten. Aktueller Code scheint nur das Googelnachrichten Suchergebnis der ersten Seite zurückgeben zu können. Wäre dankbar zu wissen, wie man alle Seiten Ergebnisse bekommt. Danke vielmals!Google News Crawler Flip-Seiten

meine Codes unter:

import requests 
from bs4 import BeautifulSoup 
import time 
import datetime 
from random import randint 
import numpy as np 
import pandas as pd 


query2Google = input("What do you want from Google News?\n") 

def QGN(query2Google): 
    s = '"'+query2Google+'"' #Keywords for query 
    s = s.replace(" ","+") 
    date = str(datetime.datetime.now().date()) #timestamp 
    filename =query2Google+"_"+date+"_"+'SearchNews.csv' #csv filename 
    f = open(filename,"wb") 
    url = "http://www.google.com.sg/search?q="+s+"&tbm=nws&tbs=qdr:y" # URL for query of news results within one year and sort by date 

    #htmlpage = urllib2.urlopen(url).read() 
    time.sleep(randint(0, 2))#waiting 

    htmlpage = requests.get(url) 
    print("Status code: "+ str(htmlpage.status_code)) 
    soup = BeautifulSoup(htmlpage.text,'lxml') 

    df = [] 
    for result_table in soup.findAll("div", {"class": "g"}): 
     a_click = result_table.find("a") 
     #print ("-----Title----\n" + str(a_click.renderContents()))#Title 

     #print ("----URL----\n" + str(a_click.get("href"))) #URL 

     #print ("----Brief----\n" + str(result_table.find("div", {"class": "st"}).renderContents()))#Brief 

     #print ("Done") 
     df=np.append(df,[str(a_click.renderContents()).strip("b'"),str(a_click.get("href")).strip('/url?q='),str(result_table.find("div", {"class": "st"}).renderContents()).strip("b'")]) 


     df = np.reshape(df,(-1,3)) 
     df1 = pd.DataFrame(df,columns=['Title','URL','Brief']) 
    print("Search Crawl Done!") 

    df1.to_csv(filename, index=False,encoding='utf-8') 
    f.close() 
    return 

QGN(query2Google) 

Antwort

0

verwendet gab einen AJAX-api zu sein, aber es ist kein avaliable mehr.
Noch können Sie Ihr Skript mit einer for-Schleife ändern, wenn Sie eine Anzahl von Seiten erhalten möchten, oder eine while-Schleife, wenn Sie alle Seiten erhalten möchten.
Beispiel:

url = "http://www.google.com.sg/search?q="+s+"&tbm=nws&tbs=qdr:y&start=" 
pages = 10 # the number of pages you want to crawl # 

for next in range(0, pages*10, 10) : 
    page = url + str(next) 
    time.sleep(randint(1, 5)) # you may need longer than that # 
    htmlpage = requests.get(page) # you should add User-Agent and Referer # 
    print("Status code: " + str(htmlpage.status_code)) 
    if htmlpage.status_code != 200 : 
     break # something went wrong # 
    soup = BeautifulSoup(htmlpage.text, 'lxml') 

    ... process response here ... 

    next_page = soup.find('td', { 'class':'b', 'style':'text-align:left' }) 
    if next_page is None or next_page.a is None : 
     break # there are no more pages # 

Beachten Sie, dass Google, nicht Bots vielleicht gefallen Sie ein Verbot bekommen.
Sie könnten ‚User-Agent‘ hinzufügen und ‚Referrer‘ in headers einen Web-Browser zu simulieren, und verwenden Sie time.sleep(random.uniform(2, 6)) einen Menschen zu simulieren ... oder Selen verwenden.

+0

Hallo Adam, der Code funktioniert perfekt, wenn mehrere Seiten Ergebnis haben, aber ich erkenne die Zeile: Wenn supp.find ('td', {'Klasse': 'b', 'Stil': 'text-align : list '}). a ist None: break wird zur Eingabeaufforderung aufgefordert AttributError: Das Objekt' NoneType 'hat kein Attribut' a ', wenn das Suchergebnis eine einzelne Seite und keine umzulegende Seite enthält. Gibt es eine Möglichkeit, das los zu werden? – Sun

+0

Diese Zeile prüft, ob es eine nächste Seite in der Navigationsleiste gibt. Wenn Sie 'inspect element' in einem Webbrowser verwenden, können Sie dies sehen. Wenn es aus irgendeinem Grund keine Navigationsleiste gibt, wird diese Zeile eine Ausnahme auslösen, ich werde meinen Code aktualisieren, um ihn zu fangen –