python - 使用 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 代码结尾。
我正在尝试找到一种方法来覆盖这种语言重复,最后使用正确的结构。
有人知道如何解决它吗?将不胜感激!
解决方案
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)]
推荐阅读
- python - 如何在 1 分钟以下的时间间隔内获得加密货币价格变化(来自 Binance)?
- android-studio - 如何列出文件夹中的文件以查看要打开的文件是否存在?在科特林
- node.js - app.use(express.urlencoded({extended:false})) 在提交时抛出错误
- python - 我如何计算天气 api 中的值
- python - RuntimeError:没有可用的 CUDA GPU
- protractor - 如何获得具有 ng-bulding 类的跨度值?
- javascript - 使用带有 create.js 脚本的“onclick”时,两个图像播放相同的声音?
- go - 如何找出golang SSA函数返回类型
- java - maven ProGuard 插件混淆失败 - 在类路径中找不到 ProGuard (proguard.ProGuard)
- python-3.x - 混合阿拉伯语+英文格式的日期需要在python中翻译成全英文