私はウェブサイトからデータを削り取ろうとしています。独自のScreamは機能しませんでした(私はHTTP 403を取得しました)、UIベースの対策(例えば、解像度のチェック)があると私は信じました。治療はセレンでさえブロックされます。セレンはそれ自身ではありませんか?
その後、私はセレンを試しました。非常に基本的なスクリプトは、ウェブサイトを経由してその方法をクリックするだけで正常に動作します。ここではどのような作品の関連抜粋だ:
今driver.get(start_url)
try:
link_next = driver.wait.until(EC.presence_of_element_located(
(By.XPATH, '//a[contains(.,"Next")]')))
link_next.click()
、データを格納するために、私はまだScrapyを必要とするつもりです。そこで私はScrapyとSeleniumを組み合わせたスクリプトを書いた。
class MyClass(CrawlSpider):
...
start_urls = [
"domainiwanttocrawl.com?page=1",
]
def __init__(self):
self.driver = webdriver.Firefox()
self.driver.wait = WebDriverWait(self.driver, 2)
def parse(self, response):
self.driver.get(response.url)
while True:
try:
link_next = self.driver.wait.until(EC.presence_of_element_located((By.XPATH, '//a[contains(.,"Next")]')))
self.driver.wait = WebDriverWait(self.driver, 2)
link_next.click()
item = MyItem()
item['source_url'] = response.url
item['myitem'] = ...
return item
except:
break
self.driver.close()
しかし、私は仕事しないが、それを超えたものになる__init__
方法にself.driver.get(url)
ようなものを追加した場合、これはまた、単にHTTP 403になります。
したがって、Selenium get関数は引き続き機能しますが、Scrapyはそれが見つかったフードの下では何も処理されませんが、start_urls
はブロックされます。しかし、私はstart_urls
なしでクロールを "キックスタート"する方法を知らない。どうやらScrapyとSeleniumは実際にはまだ統合されていないようです。
私は何ができるのですか?
ScrapyとSeleniumが実際に統合されていません。 Scrapyは独自のHTTPリクエストを行うことを意図しています。 Screamスパイダーメソッド内でSelenium呼び出しを行うと、自動的にそれらをScrapy 'Response'インスタンスに変換しません。したがって、start_urlsにあるものは、Scrapyのダウンローダーを経由します.Seleniumではなく、同じ403を表示します。 –
ありがとうございます。しかし、どのようにしてそれらを統合することができるので、サーバーとのやり取りはSeleniumを経由するでしょうか?それともそれはできないのですか? – rubykatz