CrawlSpider未执行回调

时间:2019-02-05 05:16:06

标签: scrapy web-crawler scrapy-spider

我通过扩展CrawlSpider创建了蜘蛛。

当Spider运行并找到文章页面时,我想获得一个指向作者个人资料的链接,并向个人资料页面发出请求,并使用parse_author对其进行解析,但是由于某种原因,此parse_author回调从未执行。

我的代码:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.http.request import Request


class CityamSpider4(CrawlSpider):

    name = "city_am_v4"
    custom_settings = {
        'CONCURRENT_REQUESTS': '1',
    }
    allowed_domains = ['cityam.com']
    start_urls = [
        'http://www.cityam.com',
    ]
    rules = (
        Rule(LinkExtractor(deny=('dev2.cityam.com', 'sponsored-content', )), callback='parse_item'),
    )

    def parse_item(self, response):
        # parse article page
        article_title = response.css('.article-headline h1::text').extract_first(default='null').strip()
        if article_title is not 'null':
            print 'Article url : ' + response.url
            author_url = response.css('.author-container .author-text a.author-name::attr(href)').extract_first(default='null').strip()
            print 'Author link: ' + author_url
            author_url = response.urljoin(author_url)
            print 'Author link: ' + author_url
            yield Request(author_url, callback=self.parse_author)

    def parse_author(self, response):
        # parse author page
        author_name = response.css(".cam-profile-header-title::text").extract_first(default='null').strip()
        print 'Author name: ' + author_name
        yield {
            'name': author_name,
        }

2 个答案:

答案 0 :(得分:0)

问题在于您的链接提取规则也与作者链接匹配,并且Scrapy默认情况下会丢弃重复的请求,因此您的parse_item方法是在parse_author中接收期望的响应的方法。

可能的解决方案包括:

  • 修改您的LinkExtractor,使其不匹配作者的URL。

  • 将您的作者分析逻辑从parse_author移至parse_item

  • dont_filter=True添加到Request,以便即使您所产生的那些请求是链接提取程序发现的请求的重复,也不会被滤除。

答案 1 :(得分:-1)

您在网站页面上使用了错误的端口:

  1. HTTP:80端口-
  2. HTTPS:443端口-

您的行yield Request(url=author_url, callback=self.parse_author)引用(例如) http ://www.cityam.com/profile/joseph.ray(在端口80上)。

您必须通过HTTPS使用请求: https ://www.cityam.com/profile/joseph.ray 然后程序将继续执行方法 parse_author

更改您的请求URL,每个人都会很高兴。 enter image description here 顺便说一句,我认为编写这样的代码是一种不好的做法:

print 'Article url : ' + response.url(某些编译器不会理解这一点,并且会出现错误。)

必须为: print("Article url : " + response.url)