Ошибка сканирования в Scrapy с использованием LinkExtractor и Rule - PullRequest
0 голосов
/ 11 мая 2018

Я написал простой сканер в Scrapy 1.5 на Python3 и собираю сообщения и их содержимое.

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class DailyStrengthSpider(CrawlSpider):
    name = 'daily_strength'
    allowed_domains = ['dailystrength.org']
    start_urls = ['https://www.dailystrength.org/search?query=avastin/']
    rules = (
        Rule(LinkExtractor(restrict_xpaths = '//*[@class="newsfeed__title-block"]/h2/a/@href'),follow = True),
        Rule(LinkExtractor(allow = r'/group/[a-zA-z]\-/discussion/[a-zA-z0-9]\_\-',callback = 'parse_post'))
    )

Здесь я указываю URL-адреса, которые должны быть разрешены в приведенной выше строке. Я получил сообщение об ошибке

TypeError: init () получил неожиданный аргумент ключевого слова 'callback'

Я проверил синтаксис в учебниках.

def parse_post(self,response):
    user = response.xpath('//*[@class="newsfeed__posted-by"]/a/text()').extract_first()
    time = response.xpath('//*[@class="newsfeed__item-time"]/text()').extract_first()
    full_post = response.xpath('//*[@class="posts__content"]/text()').extract_first()
    comment_users = response.xpath('//*[@class="comments__name"]/a/text()').extract()
    comments = response.xpath('//*[@class="comments__comment-text"]/text()').extract() 
    yield {"UserName":user,"Time":time,"Post":full_post}

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы передаете callback конструктору LinkExtractor (который не принимает этот параметр ), хотя он предназначен для перехода к конструктору Rule.

Просто измените вызов конструктора:

Rule(LinkExtractor(allow = r'/group/[a-zA-z]\-/discussion/[a-zA-z0-9]\_\-'), callback = 'parse_post')
0 голосов
/ 11 мая 2018

Вы передаете аргумент callback в LinkExtractor вместо передачи его в объект Rule.

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class DailyStrengthSpider(CrawlSpider):
    name = 'daily_strength'
    allowed_domains = ['dailystrength.org']
    start_urls = ['https://www.dailystrength.org/search?query=avastin/']
    rules = (
        Rule(LinkExtractor(restrict_xpaths = '//*[@class="newsfeed__title-block"]/h2/a/@href'),follow = True),
        Rule(LinkExtractor(allow = r'/group/[a-zA-z]\-/discussion/[a-zA-z0-9]\_\-'), callback = 'parse_post')
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...