0

Googleニュースのすべてのページからすべての結果を得るために、クローラを改良して、クエリに関するすべてのニュース結果をクロールしています。現在のコードは、最初のページのGoogelニュース検索結果のみを返すようです。すべてのページの結果を取得する方法を知っていただければ幸いです。どうもありがとう!以下Googleニュースクローラフリップページ

私のコード:

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) 

答えて

0

は、AJAX APIがありましたが、それはavaliableもはやません。
複数のページを取得する場合はforループを使用し、すべてのページを取得する場合はwhileループを使用してスクリプトを変更できます。
例:

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 # 

あなたが禁止を得るかもしれない、Googleがボットを好きではないことに注意してください。
headersに「User-Agent」と「Referer」を追加して、Webブラウザをシミュレートし、time.sleep(random.uniform(2, 6))を使用して人間をシミュレートするか、セレンを使用することができます。

+0

こんにちはアダム、結果の複数のページを持つとき、コードは完璧に動作しますが、私は行を実現します:if soup.find( 'td'、{'class': 'b'、 'style': 'text-align :None ':None):なし はエラーを表示しますAttributeError:検索結果が単一ページで、反転するページがない場合、' NoneType 'オブジェクトには属性' a 'がありません。これを取り除く方法はありますか? – Sun

+0

この行は、ナビゲーションバーに次のページがあるかどうかを確認します。これは、Webブラウザで 'inspect element'を使用すると確認できます。何らかの理由でナビゲーションバーが表示されない場合、この行は例外を発生させます。私はコードをキャッチするように更新します –

関連する問題