首页 > 解决方案 > 使用 Scrapy [Python] 抓取相对 URL

问题描述

我是 SEO 专家,不是很喜欢编码。但是想尝试使用 Scrapy 模块在 Python 中创建一个断开的链接检查器,它将抓取我的网站并向我显示所有带有 404 代码的内部链接。

到目前为止,我已经设法编写了这段代码:

    import scrapy
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy.linkextractors import LinkExtractor
    from crawler.items import Broken


    class Spider(CrawlSpider):
        name = 'example'
        handle_httpstatus_list = [404]
        allowed_domains = ['www.example.com']

        start_urls = ['https://www.example.com']

        rules = [Rule(LinkExtractor(), callback='parse_info', follow=True)]
        def parse_info(self, response):
            report = [404]
            if response.status in report:
                Broken_URLs = Broken()
                #Broken_URLs['title']= response.xpath('/html/head/title').get()
                Broken_URLs['referer'] = response.request.headers.get('Referer', None)
                Broken_URLs['status_code']= response.status
                Broken_URLs['url']= response.url
                Broken_URLs['anchor']= response.meta.get('link_text')


                return Broken_URLs

只要我们在网站结构中有绝对网址,它就可以很好地爬行。

但是在某些情况下,当爬虫遇到相对 url 并最终得到这种链接时:

通常应该是:

https://www.example.com/en/ ...

但它给了我:

https://www.example.com/en/en/ .. - 双语言文件夹,以 404 代码结尾。

我正在尝试找到一种方法来覆盖这种语言重复,最后使用正确的结构。

有人知道如何解决它吗?将不胜感激!

标签: pythonscrapyweb-crawler

解决方案


Scrapyurllib.parse.urljoin用于处理相对 url。

process_request您可以通过在定义中添加自定义函数来修复它Rule

def fix_urls():
    def process_request(request, response):
        return request.replace(url=request.url.replace("/en/en/", "/en/"))
    return process_request

class Spider(CrawlSpider):
    name = 'example'
...
    rules = [Rule(LinkExtractor(), process_request=fix_urls(), callback='parse_info', follow=True)]

推荐阅读