Scrapy Spider未返回任何结果

11dmarpk  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(185)

我正在尝试用Scrapy构建一个scraper。我的总体目标是刮取一个网站的网页,并返回不同页面的所有可下载文档的链接列表。
不知何故,我的代码只返回None。我不确定这可能是什么原因。提前感谢您的帮助。请注意,robots.txt不会导致此问题。

import re
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from w3lib.url import url_query_cleaner

def processlinks(links):
    for link in links:
        link.url = url_query_cleaner(link.url)
        yield link

class ExampleCrawler(CrawlSpider):
    name = 'example'
    allowed_domains = ['www.example.com']
    start_urls = ["https://example.com/"] 
    rules = (
        Rule(
            LinkExtractor(
                deny=[
                    re.escape('https://www.example.com/offsite'),
                    re.escape('https://www.example.com/whitelist-offsite'),
                ],
            ),
            process_links=processlinks,
            callback='parse_links',
            follow=False
        ),)

    def parse_links(self, response):
        html = response.body

       
        links = scrapy.Selector(text=html).xpath('//@href').extract()

       
        documents = []
        for link in links:
            absolute_url = urljoin(response.url, link)
            documents.append(absolute_url)

       
        return documents

我期望收到一个包含网站所有网页的所有文档下载链接的列表。我只得到一个None值返回。看起来parse_links方法没有被调用。

fivyi3re

fivyi3re1#

代码中有一些逻辑和技术问题。我已经对代码进行了修改。下面是详细信息。
您的站点被重定向到另一个站点,因此您需要更新允许的域并向其添加www.iana.org

allowed_domains = ['www.example.com', 'www.iana.org']

其次,在scrappy中,你不能返回一个列表或字符串,它应该是一个表单或字典中的请求或团队。

import re
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from w3lib.url import url_query_cleaner
from urllib.parse import urljoin
import scrapy

def processlinks(links):
    for link in links:
        link.url = url_query_cleaner(link.url)
        yield link

class ExampleCrawler(CrawlSpider):
    name = 'example'
    allowed_domains = ['www.example.com', 'www.iana.org']
    start_urls = ["https://example.com/"] 
    rules = (
        Rule(
            LinkExtractor(
                deny=[
                    re.escape('https://www.example.com/offsite'),
                    re.escape('https://www.example.com/whitelist-offsite'),
                ],
            ),
            process_links=processlinks,
            callback='parse_links',
            follow=False
        ),)

    def parse_links(self, response):
        html = response.body

       
        links = scrapy.Selector(text=html).xpath('//@href').extract()

       
        documents = []
        for link in links:
            absolute_url = urljoin(response.url, link)
            documents.append(absolute_url)

       
        return {"document": documents}

相关问题