使用 Scrapy [Python] 抓取亲戚 URL

Crawling of relative URL's with Scrapy [Python]

我是 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 就可以很好地抓取。

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

通常应该是:

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

但它给了我:

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

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

有人知道怎么解决吗?将不胜感激!

Scrapy 使用 urllib.parse.urljoin 处理相对 URL。

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

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)]