【问题标题】:click button on website using scrapy使用scrapy点击网站上的按钮
【发布时间】:2016-11-26 02:05:14
【问题描述】:

我想问一下如何从this site点击下一步按钮(更改网站的页码)(然后再爬到页码末尾)如何?

我尝试将 scrape 与 selenium 结合使用,但仍然出现错误并显示 "line 22 self.driver = webdriver.Firefox() ^ IndentationError: expected an indented block"

我不知道为什么会这样,我觉得我的代码很好。有人可以解决这个问题吗?

这是我的来源:

from selenium import webdriver
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from now.items import NowItem
class MySpider(BaseSpider):
name = "nowhere"
allowed_domains = ["n0where.net"]
start_urls = ["https://n0where.net/"]

def parse(self, response):
    for article in response.css('.loop-panel'):
        item = NowItem()
        item['title'] = article.css('.article-title::text').extract_first()
        item['link'] = article.css('.loop-panel>a::attr(href)').extract_first()
        item['body'] ='' .join(article.css('.excerpt p::text').extract()).strip()
        #item['date'] = article.css('[itemprop="datePublished"]::attr(content)').extract_first()
        yield item

def __init__(self):
    self.driver = webdriver.Firefox()

    def parse2(self, response):
    self.driver.get(response.url)

    while True:
        next = self.driver.find_element_by_xpath('/html/body/div[4]/div[3]/div/div/div/div/div[1]/div/div[6]/div/a[8]/span')

        try:
            next.click()

            # get the data and write it to scrapy items
        except:
            break

    self.driver.close()`

这是我对我的程序伙伴的捕获:

【问题讨论】:

  • 您的代码缩进不足,第 5 行之后的所有内容都必须缩进 4 个空格,因为该代码属于您的类。
  • 啊,python有规定吗? -_- 我不知道,在此之前我使用 java 或 c# 进行编码,并且两者都没有这样的规则,它似乎有很大的不同......顺便说一句,我所有的代码看起来都很好,可以运行..但是在我添加第 19 行和更多错误之后,我不知道为什么要配合(在 mozilla 驱动程序之后)...
  • 是的,python 中的缩进很重要,这就是你定义范围的方式,因为没有花括号等。老实说,你应该在任何编程语言中进行适当的缩进,无论是否使用花括号......
  • 这里的队友,我的代码...它似乎可以自动添加 4 个空格,但我不知道为什么当我在这里复制粘贴它时它会自动变成左对齐 -_- 顺便说一句,你有解决方案吗我面临什么问题?
  • 在图片上看到,我重新上传我的源图片伙伴..

标签: python selenium scrapy web-crawler


【解决方案1】:

这是一个缩进错误。查看错误附近的行:

    def parse2(self, response):
    self.driver.get(response.url)

这两行的第一行以冒号结尾。所以,第二行应该比第一行缩进更多。

有两种可能的修复方法,具体取决于您要执行的操作。为第二个添加缩进级别:

    def parse2(self, response):
        self.driver.get(response.url)

或者移动parse2 function out of theinit`函数:

def parse2(self, response):
    self.driver.get(response.url)

def __init__(self):
    self.driver = webdriver.Firefox()

    # etc.

【讨论】:

  • 在我像你一样重写那行之后,它似乎还可以,但是为什么突然没有做爬行并强制关闭我的 mozilla firefox,任何解决方案伙伴?
  • @beboy 您的网络驱动程序关闭,因为它实际上没有被使用,请检查我的回答,了解为什么会发生这种情况。
【解决方案2】:

忽略语法和缩进错误,您的代码逻辑通常存在问题。

您所做的是创建 webdriver 并且从不使用它。你的蜘蛛在这里做的是:

  1. 创建 webdriver 对象。
  2. self.start_urls 中的每个网址安排一个请求,在您的情况下它只有一个。
  3. 下载它,制作Response对象并将其传递给self.parse()
  4. 您的 parse 方法似乎找到了一些 xpath 并生成了一些项目,因此 scrapy 会为您生成一些已找到的项目(如果有)
  5. 完成

您的 parse2 从未被调用过,因此您的 selenium webdriver 从未被使用过。

由于在这种情况下您没有使用 scrapy 下载任何内容,您只需覆盖蜘蛛的 start_requests()(

类似:

from selenium import webdriver
import scrapy
from scrapy import Selector


class MySpider(scrapy.Spider):
    name = "nowhere"
    allowed_domains = ["n0where.net"]
    start_url = "https://n0where.net/"

    def start_requests(self):
        driver = webdriver.Firefox()
        driver.get(self.start_url)
        while True:
            next_url = driver.find_element_by_xpath(
                '/html/body/div[4]/div[3]/div/div/div/div/div[1]/div/div[6]/div/a[8]/span')
            try:
                # parse the body your webdriver has
                self.parse(driver.page_source)
                # click the button to go to next page 
                next_url.click()
            except:
                break
        driver.close()

    def parse(self, body):
        # create Selector from html string
        sel = Selector(text=body)
        # parse it
        for article in sel.css('.loop-panel'):
            item = dict()
            item['title'] = article.css('.article-title::text').extract_first()
            item['link'] = article.css('.loop-panel>a::attr(href)').extract_first()
            item['body'] = ''.join(article.css('.excerpt p::text').extract()).strip()
            # item['date'] = article.css('[itemprop="datePublished"]::attr(content)').extract_first()
            yield item

【讨论】:

  • 谢谢老兄,我明天试试,现在我已经准备好了介绍我是使用python的新手,它与java或c#有很大的不同......所以定位python编程中的数字,列出代码对逻辑编码的影响..
  • 嘿,成功了,主要问题是 firefox v47 它与我的 selenium 版本不兼容,所以我降级了 firefox,顺便说一句,你知道为什么会发生这个错误“TypeError: 'NoneType' object is not可迭代”是什么意思?以防万一,我想做报废直到页面的最后......
  • 关于错误,它意味着它在那里所说的内容。您的代码正在尝试遍历 None 值。我猜是for article in sel.css('.loop-panel')这个位,你需要检查是否有一些文章,如果没有则中断进程,即if not sel.css('.loop-panel'): return
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2019-11-28
相关资源
最近更新 更多