使用 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)]
我是 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)]