即使使用Selenium,Scrapy也会受阻;硒本身不是吗?

时间:2017-01-14 01:53:30

标签: selenium web-scraping scrapy http-status-code-403

我正在尝试从网站上删除数据。 Scrapy本身不起作用(我得到HTTP 403),这让我相信有一些基于UI的对策(例如检查分辨率)。

然后我尝试了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__的内容,那将会有效,但除此之外什么都没有。

所以从本质上说:Selenium get函数继续工作,而Scrapy在start_urls中发现的内容被阻止了。但我不知道如何在没有start_urls的情况下“开始”爬行。似乎Scrapy和Selenium在某种程度上还没有实际集成。

知道为什么以及我能做什么?

1 个答案:

答案 0 :(得分:0)

Scrapy是一个非常棒的抓取框架,你可以免费获得大量的东西。并且,如果将403直接从大门出来,那么它基本上完全丧失了能力。

Selenium没有点击403,你得到了正常的回复。这太棒了,但不是因为Selenium就是答案; Scrapy仍然在水中,这是工作马,在这里。

Selenium工作的事实意味着你最有可能通过一些简单的措施让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