关于scrapy里response拼接urljoin属性的理解

因为爬虫必须要翻页,那么url链接上需要加载新的参数或者值,拼接的方法有不少,如果不是动态jajx的,而是静态的有规律的url翻页地址的话,用urljoin非常方便

起始值(url)

    next_page_url = response.xpath('...').extract() #搞到拼接的变动的参数内容
    if next_page_url is not None:
        yield scrapy.Request(response.urljoin(next_page_url))

分析这句话:yield scrapy.Request(response.urljoin(next_page_url))

response.urljoin(next_page_url)整体是一个参数,作为一个url的链接传入函数scrapy.Request(yield这个函数可以爬取新的下一页的链接)

response.urljoin(next_page_url)这个怎么解释呢,就是next_page_url作为参数传入response.urljoin这个函数,直接合成了新的下一页链接。

其实这个函数的标准写法是response.urljoin(url,next_page_url)但是括号里前一个url就是在爬虫最开始设定的shart_urls = [’…’]里面这个url

举例:
比如scrapy起始地址为’http://quotes.toscrape.com/’
那么response.url的值就是默认的:‘http://quotes.toscrape.com/’
此时在用response.urljoin这个函数,起始的url这个参数就可以不要写进去,而直接写后面需要join的参数就行了!!!
假设这个时候设定next_page_url='此处必须为字符串形式‘
这个时候输出结果为:

next_page_url = ‘/page/2’
response.urljoin(next_page_url)
‘http://quotes.toscrape.com/page/2’

next_page_url = ‘wherearethefathers?’
response.urljoin(next_page_url)
‘http://quotes.toscrape.com/wherearethefathers’

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用自定义的 Scrapy 中间件来处理 response.follow() 请求。 首先,在你的 Scrapy 项目中创建一个中间件文件,然后在这个文件中定义一个新的中间件类。在这个类中,你需要实现以下三个方法: ``` from scrapy import signals class MyMiddleware: def __init__(self): # 在这初始化中间件 pass @classmethod def from_crawler(cls, crawler): # 创建中间件实例,并将其绑定到信号 middleware = cls() crawler.signals.connect(middleware.spider_opened, signals.spider_opened) return middleware def process_request(self, request, spider): # 在这处理 response.follow() 请求 if request.callback == "parse": request = request.replace(callback=self.parse) return request def parse(self, response): # 在这处理响应数据 pass ``` 然后,你需要在 Scrapy 的设置文件中启用你的中间件: ``` # settings.py DOWNLOADER_MIDDLEWARES = { "myproject.middlewares.MyMiddleware": 500, } ``` 最后,在你的爬虫文件中使用 response.follow() 方法即可。 ### 回答2: Scrapy是一个用于爬取网站数据的Python框架,可以通过设置中间件对请求和响应进行处理。中间件是Scrapy中的一个组件,可以对请求进行修改、过滤或重定向,同时也可以对响应进行处理。 要将response.follow方法加入到中间件,需要按照以下步骤进行操作: 1. 创建一个新的Scrapy中间件类,继承自scrapy.downloadermiddlewares.DownloaderMiddleware类。 2. 在中间件类中重写process_response方法,该方法会在下载器下载完网页后被调用。 3. 在process_response方法中判断当前的响应是否需要进行重定向,如果需要重定向,则调用response.follow方法来跟进重定向的URL。 4. 返回处理后的响应对象。 下面是一个示例: ```python from scrapy import Request class MyMiddleware(object): def process_response(self, request, response, spider): if response.status in [301, 302]: redirected_url = response.headers.get('Location') if redirected_url: new_request = Request( url=redirected_url, headers=request.headers, cookies=request.cookies, meta=request.meta, dont_filter=True # 如果要进行重定向,需要设置dont_filter为True,避免重复访问 ) # 调用response.follow方法来跟进重定向的URL return spider.follow(new_request) return response ``` 在上述示例中,我们创建了一个名为MyMiddleware的中间件类,其中重写了process_response方法。方法中首先判断响应的状态码是否为301或302,如果是,则获取重定向的URL,并创建一个新的Request对象。然后,通过调用spider.follow方法来跟进重定向的URL。最后,返回处理后的响应对象。 需要注意的是,上述示例仅为演示如何将response.follow方法加入到中间件,具体的实现方式可能会因具体的项目需求而有所变化。 ### 回答3: 要将`response.follow`方法添加到Scrapy的中间件中,你需要按照以下几个步骤进行操作: 1. 创建一个自定义的中间件类,继承自Scrapy的`DownloaderMiddleware`类,并重写`process_request`方法: ```python from scrapy import Request class MyMiddleware(object): def process_request(self, request, spider): if isinstance(request, Request): # 判断请求是否为Request类型 if 'follow' in request.meta: # 判断请求的meta中是否存在'follow'字段 url = request.url callback = request.callback priority = request.priority dont_filter = request.dont_filter return Request(url=url, callback=callback, priority=priority, dont_filter=dont_filter) return None ``` 2. 在Scrapy的设置文件`settings.py`中,将自定义的中间件添加到`DOWNLOADER_MIDDLEWARES`配置项中: ```python DOWNLOADER_MIDDLEWARES = { 'yourproject.middlewares.MyMiddleware': 543, # 数字越小,优先级越高 } ``` 3. 在爬虫中使用`response.follow`方法,并在请求的meta中添加`'follow': True`,以触发中间件的处理: ```python import scrapy class MySpider(scrapy.Spider): name = 'myspider' def start_requests(self): url = 'http://example.com/page1' yield scrapy.Request(url=url, callback=self.parse, meta={'follow': True}) def parse(self, response): # 使用response.follow方法,会调用中间件中的process_request方法 yield response.follow('/page2', callback=self.parse_page2) def parse_page2(self, response): # 解析爬取到的数据 pass ``` 通过以上步骤,你就可以将`response.follow`方法添加到中间件中,并在需要时使用`response.follow`方法进行请求的跟进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值