【问题标题】:Python scrapy reddit confirm button breaks crawlPython scrapy reddit 确认按钮中断爬网
【发布时间】:2016-08-27 22:12:15
【问题描述】:

我正在尝试抓取网站以获取数据,当我到达 18 岁以上的页面时,我收到了一个警告页面。我的爬虫通常可以在大多数 reddit 页面上运行,并且我可以成功获取数据。我尝试使用 selenium 移动到下一页,当它打开浏览器时成功,但爬虫没有跟随到该页面。下面是我的代码..

class DarknetmarketsSpider(scrapy.Spider):
    name = "darknetmarkets"
    allowed_domains = ["https://www.reddit.com"]
    start_urls = (
        'http://www.reddit.com/r/darknetmarkets',
    )
    rules = (Rule(LinkExtractor(allow=()), callback='parse_obj', follow=False),)
    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get('http://www.reddit.com/r/darknetmarkets')
        #self.driver.get('https://www.reddit.com/over18?dest=https%3A%2F%2Fwww.reddit.com%2Fr%2Fdarknetmarketsnoobs')

        while True:
            try:
                YES_BUTTON = '//button[@value="yes"]'
                next = self.driver.find_element_by_xpath(YES_BUTTON).click()


                url = 'http://www.reddit.com/r/darknetmarkets'

                next.click()
            except:
                break

        self.driver.close()


        item = darknetItem()
        item['url'] = []
        for link in LinkExtractor(allow=(), deny=self.allowed_domains).extract_links(response):
            item['url'].append(link.url)
            print link

按钮的css..

<button class="c-btn c-btn-primary" type="submit" name="over18" value="yes">continue</button>

【问题讨论】:

  • Reddit 有an API
  • 我看到大多使用 praw,但更喜欢斗志昂扬的 ..
  • Selenium 和 scrapy 不会相互通信,除非您专门从一个发送到另一个。一旦 selenium 爬取所有网站,所有数据都会丢失
  • 啊,有趣,有没有可能在 scrapy 中解决这个问题,那么我想这是我的问题。

标签: python web-scraping scrapy


【解决方案1】:

我看到您试图绕过该 subreddit 中的年龄限制屏幕。单击“继续”按钮后,该选择将保存为 cookie,因此您必须重新进入 scrapy。

使用 Selenium 点击它后,保存 cookie 并将它们发送到 scrapy

代码由scrapy authentication login with cookies提供

class MySpider(scrapy.Spider):
name = 'MySpider'
start_urls = ['http://reddit.com/']

def get_cookies(self):
    self.driver = webdriver.Firefox()
    base_url = "http://www.reddit.com/r/darknetmarkets/"
    self.driver.get(base_url)
    self.driver.find_element_by_xpath("//button[@value='yes']").click()
    cookies = self.driver.get_cookies()
    self.driver.close()
    return cookies

def parse(self, response):
    yield scrapy.Request("http://www.reddit.com/r/darknetmarkets/",
        cookies=self.get_cookies(),
        callback=self.darkNetPage)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多