我是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代码结尾。
我正试图找到一种方法来覆盖这种语言复制,并在结尾处使用正确的结构。
有人知道怎么修吗?会很感激的!
发布于 2021-01-19 21:34:37
使用urllib.parse.urljoin处理相对urls。
您可以通过将自定义函数添加到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)]https://stackoverflow.com/questions/65791593
复制相似问题