使用scrapy

时间:2016-07-22 08:38:33

标签: python selenium scrapy web-crawler

我想询问(抓取)如何(点击抓取)点击下一个按钮(更改网站的号码页面)(然后从this site

进行更多抓取,直到页码末尾)

我尝试将刮痧与硒混合,但仍有错误,并说"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()`

这是我对我的节目伙伴的捕获: capture program

2 个答案:

答案 0 :(得分:2)

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

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

  1. 创建webdriver对象。
  2. self.start_urls中的每个网址安排一个请求,在您的情况下,它只是一个。
  3. 下载它,制作Response对象并将其传递给self.parse()
  4. 您的解析方法似乎找到了一些xpath并制作了一些项目,因此scrapy会为您提供一些找到的项目(如果有的话)
  5. 完成
  6. 你的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
    

答案 1 :(得分:1)

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

 Dealer *dealer = [[Dealer alloc] initWithDictionary:object[@"Dealer"]];

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

根据您的要求,有两种可能的修复方法。将缩进级别添加到第二个:

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

或移动 def parse2(self, response): self.driver.get(response.url) init `函数:

parse2 function out of the