私はウェブスクレイピングを学ぼうとしていて、奇妙な問題に直面しています...私の仕事は、特定の日付範囲のトピックに関するニュースをGoogleで検索し、結果の数を数えることです。
私の簡単なコードは
import requests, bs4
payload = {'as_epq': 'James Clark', 'tbs':'cdr:1,cd_min:1/01/2015,cd_max:1/01/2015','tbm':'nws'}
r = requests.get("https://www.google.com/search", params=payload)
soup = bs4.BeautifulSoup(r.text)
elems = soup.select('#resultStats')
print(elems[0].getText())
そして私が得る結果は
About 8,600 results
結果が間違っているという事実を除けば、明らかにすべてが機能します。FirefoxでURLを開くと(r.urlで完全なURLを取得できます)
https://www.google.com/search?tbm=nws&as_epq=James+Clark&tbs=cdr%3A1%2Ccd_min%3A1%2F01%2F2015%2Ccd_max%3A1%2F01%2F2015
結果は実際には2つしかないことがわかります。手動でHTMLファイルをダウンロードし、ページソースを開いて、id = "resultStats"を検索すると、結果の数は実際に2つであることがわかります。
保存されたHTMLファイルとスープアイテムで同じidタグを検索すると、2つの異なる数値結果が得られる理由を誰かが理解するのを手伝ってもらえますか?
**************更新問題は、requests.getによって正しく処理されないカスタム日付範囲にあるようです。セレンと同じURLを使用すると、正しい答えが得られます
from selenium import webdriver
driver = webdriver.Firefox()
driver.get(url)
content = driver.page_source
soup = bs4.BeautifulSoup(content)
elems = soup.select('#resultStats')
print(elems[0].getText())
そして答えは
2 results (0.09 seconds)
問題は、Firefoxでページを開く必要があるため、この方法がより面倒に見えることです...
この問題を引き起こしていることがいくつかあります。まず、日付の日と月の部分を2桁で表示する必要があります。また、一般的なブラウザのユーザーエージェント文字列も必要です。次のコードが機能するはずです。
import requests, bs4
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
}
payload = {'as_epq': 'James Clark', 'tbs':'cdr:1,cd_min:01/01/2015,cd_max:01/01/2015', 'tbm':'nws'}
r = requests.get("https://www.google.com/search", params=payload, headers=headers)
soup = bs4.BeautifulSoup(r.content, 'html5lib')
print soup.find(id='resultStats').text
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加