Scrapy学习第六课

python爬虫框架scrapy学习第六课

知识点:start_requests()

  • 函数解释:该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。当spider启动爬取并且未制定URL时,该方法被调用。 当指定了URL时,make_requests_from_url() 将被调用来创建Request对象。 该方法仅仅会被Scrapy调用一次,因此您可以将其实现为生成器。该方法的默认实现是使用 start_urls 的url生成Request。

  • 源码分析:针对start_urls中的每一个url 发起resquest请求。当start_urls中有多个链接时,逐步发起请求。

def start_requests(self):
    for url in self.start_urls:
        yield self.make_requests_from_url(url)
def make_requests_from_url(self, url):
    return Request(url, dont_filter=True)
  • 代码演示
    – 不显示引用start_requests展示爬取顺序和爬取结果
import scrapy

class KrSpider(scrapy.Spider):
    name = 'kr'
    allowed_domains = ['ifeng.com']
    start_urls = [
        'http://news.ifeng.com/a/20181225/60208881_0.shtml',
        'http://news.ifeng.com/a/20181225/60208818_0.shtml',
        'http://news.ifeng.com/a/20181225/60208776_0.shtml'
    ]
    
    def parse(self, response):
        filename = "test.html"
        title = response.xpath('//h1[@id="artical_topic"]/text()').extract()
        print(title)
        

start_urls中包含3个url,按照函数释义,会按照顺序逐步被调用爬取数据,观其结果可知,顺序和结果是正确的。
在这里插入图片描述
–修改start_requests的内容,通过爬虫结果,证实该函数在发起爬取过程中被调用

import scrapy


class KrSpider(scrapy.Spider):
    name = 'kr'
    allowed_domains = ['ifeng.com']
    start_urls = [
        'http://news.ifeng.com/a/20181225/60208881_0.shtml',
        'http://news.ifeng.com/a/20181225/60208818_0.shtml',
        'http://news.ifeng.com/a/20181225/60208776_0.shtml'
    ]

    def start_requests(self):
       yield scrapy.Request(url=self.start_urls[0], callback=self.parse)

    def parse(self, response):
        filename = "test.html"
        title = response.xpath('//h1[@id="artical_topic"]/text()').extract()
        print(title)
        

在这里插入图片描述

从结果中可知,显示的start_requests函数被调用,覆盖原有的功能。

  • 代码修改:get变post…该功能暂未学习,后续补充。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章