2017-01-14 5 views
0

Я пытаюсь очистить данные с веб-сайта. Scrapy сама по себе не работала (я получаю HTTP 403), что заставило меня поверить, что есть некоторые контрмеры на основе пользовательского интерфейса (например, проверка разрешения).Scrapy блокируется даже селеном; Селен сам по себе не делает?

Затем я попробовал Selenium; очень простой скрипт, нажимая свой путь через сайт, работает отлично. Вот соответствующий отрывок из того, что работает:

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() 

Но это будет также просто привести к HTTP 403. Если я добавить что-то вроде self.driver.get(url) к методу __init__, который будет работать, но ничего кроме этого.

Таким образом, по существу: функция получения селена продолжает работать, в то время как любая Scrapy делает под капотом с тем, что она находит в start_urls, блокируется. Но я не знаю, как «запустить» сканирование без start_urls. Кажется, что Scrapy и Selenium пока еще не интегрированы.

Любая идея, почему и что я могу сделать?

+0

Scrapy и Селен действительно не интегрированы. Scrapy предназначена для выполнения собственных HTTP-запросов. Если вы выполняете вызовы Selenium в методах Spider Scrap, они не будут автоматически преобразовывать их в экземпляры Scrapy 'Response'.Так что все, что находится в 'start_urls', будет проходить через загрузчика Scrapy, а не через Selenium, поэтому показывая те же 403s. –

+0

Спасибо. Но как я могу их интегрировать, чтобы любое взаимодействие с сервером проходило через Selenium? Или это просто невозможно? – rubykatz

ответ

0

Scrapy - довольно устрашающая скребковая рамка, вы получаете массу вещей бесплатно. И, если он получает 403 s прямо из ворот, то это в основном полностью недееспособно.

Selenium не попадает в 403, и вы получаете нормальный отклик. Это потрясающе, но не потому, что Селен - это ответ; Scrapy все еще мертв-в-воде, и здесь есть рабочая лошадь.

Тот факт, что Selenium works означает, что вы, скорее всего, получите Scrapy, используя несколько простых мер. То, что это займет, не ясно (в вашем вопросе недостаточно деталей), но ссылка ниже - отличное место для начала.

Scrapy docs - Avoid getting banned

Положив некоторое время в выяснение того, как получить Scrapy мимо 403 это маршрут, я рекомендую. Селен замечательный, и все, но Scrapy - это безжалостность, когда дело доходит до веб-соскабливания. В любом случае это не займет много времени.

Это утилита, которая может помочь: 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 

Ниже основной способ интеграции get_agent с Scrapy. (Он не проверен, но должен указывать вам в правильном направлении).

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

Смежные вопросы