2017-01-14 6 views
0

私はウェブサイトからデータを削り取ろうとしています。独自の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は実際にはまだ統合されていないようです。

私は何ができるのですか?

+0

ScrapyとSeleniumが実際に統合されていません。 Scrapyは独自のHTTPリクエストを行うことを意図しています。 Screamスパイダーメソッド内でSelenium呼び出しを行うと、自動的にそれらをScrapy 'Response'インスタンスに変換しません。したがって、start_urlsにあるものは、Scrapyのダウンローダーを経由します.Seleniumではなく、同じ403を表示します。 –

+0

ありがとうございます。しかし、どのようにしてそれらを統合することができるので、サーバーとのやり取りはSeleniumを経由するでしょうか?それともそれはできないのですか? – rubykatz

答えて

0

スクラップはかなり素晴らしいスクレイピングフレームワークです。あなたは無料でたくさんのものを手に入れます。そして、それが403をゲートから真っ直ぐに出ていれば、それは基本的に完全に機能しなくなります。

セレンは403に当たらず、正常な応答を得ます。それは素晴らしいですが、セレンは答えではありません。治療はまだ死んでおり、それは仕事の馬です。

Seleniumが動作しているという事実は、いくつかの簡単な方法でScrapyが動作する可能性が高いことを意味します。正確にはそれが取ることは明らかではありませんが(あなたの質問には詳細が不足しています)、以下のリンクは始めるのに最適な場所です。 403過ぎScrapyを取得する方法を考え出すにいくつかの時間を置く

Scrapy docs - Avoid getting banned

私はお勧めルートです。セレンは素晴らしいですが、スクラピーはウェブスクレーピングに関しては大変です。運があれば、それはあまりかかりません。

ここには役に立つかもしれないutilがあります:agents.pyこれは、普及しているユーザエージェント(2014年頃)のリストからランダムなユーザエージェントを取得するために使用できます。以下は

>>> for _ in range(5): 
... print agents.get_agent() 
... 
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 
Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 
Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0 

Scrapyでget_agentを統合するための基本的な方法です。 (これはテストされていませんが、正しい方向に向ける必要があります)。

import scrapy 
from scrapy.http import Request 

from agents import get_agent 


EXAMPLE_URL = 'http://www.example.com' 


def get_request(url): 
    headers = { 
     'User-Agent': get_agent(), 
     'Referer': 'https://www.google.com/' 
    } 
    return Request(url, headers=headers) 


class MySpider(scrapy.Spider): 
    name = 'myspider' 

    def start_requests(self): 
     yield get_request(EXAMPLE_URL) 

編集

ユーザエージェントに関しては、これはより簡単に同じことが、少しの達成可能性があるように見えます:scrapy-fake-useragent

関連する問題