小爬爬6:2请求传参

1.scrapy的请求传参:

请求传参:
    - 使用场景:如果使用scrapy爬取的数据没有在同一张页面中,则必须使用请求传参
    - 编码流程:
        - 需求:爬取的是首页中电影的名称和详情页中电影的简介(全站数据爬取)
        - 基于起始url进行数据解析(parse)
            - 解析数据
                - 电影的名称
                - 详情页的url
                - 对详情页的url发起手动请求(指定的回调函数parse_detail),进行请求传参(meta)
                    meta传递给parse_detail这个回调函数
                - 封装一个其他页码对应url的一个通用的URL模板
                - 在for循环外部,手动对其他页的url进行手动请求发送(需要指定回调函数==》parse)
            - 定义parse_detail回调方法,在其内部对电影的简介进行解析。解析完毕后,需要将解析到的电影名称
                和电影的简介封装到同一个item中。
                - 接收传递过来的item,并且将解析到的数据存储到item中,将item提交给管道

五大组件:所有的数据流都会走"引擎"

"请求对象"

引擎怎么知道什么时间调用什么方法?

引擎:接收所有数据,进行事物的触发

引擎根据接收不同类型的数据流决定下一步触发什么方法.

2.

上图最后一条修改成下图,加上网址

settings.py三件套

USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36‘ROBOTSTXT_OBEY = FalseLOG_LEVEL=‘ERROR‘
# -*- coding: utf-8 -*-
import scrapy
class MovieSpider(scrapy.Spider):
    name = ‘movie‘
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [‘https://www.4567tv.tv/frim/index1.html‘]
    #爬取电影名称(首页),简介(详情)
    def parse(self, response):
        pass

拿取ul的xpath

# -*- coding: utf-8 -*-
import scrapy

class MovieSpider(scrapy.Spider):
    name = ‘movie‘
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [‘https://www.4567tv.tv/frim/index1.html‘]
    #爬取电影名称(首页),简介(详情)
    def parse(self, response):
        li_list=response.xpath("/html/body/div[1]/div/div/div/div[2]/ul/li")
        for li in li_list:
            name=li.xpath(‘./div/a/@title‘).extract_first()
            detail_url=‘https://www.4567tv.tv‘+li.xpath(‘./div/a/@href‘).extract_first()
            #下面发送请求
            #对详情页的url发起get请求
            yield scrapy.Request(url=detail_url,callback=self.detail_parse)
    #解析详情页的页面数据
    def detail_parse(self,response):
        desc=response.xpath(‘/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()‘).extract_first()

思考,如何写items.py?

导入上边的文件

movie.py文件

# -*- coding: utf-8 -*-
import scrapy
from moviePro.items import MovieproItem

class MovieSpider(scrapy.Spider):
    name = ‘movie‘
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [‘https://www.4567tv.tv/frim/index1.html‘]
    #爬取电影名称(首页),简介(详情)
    def parse(self, response):
        li_list=response.xpath("/html/body/div[1]/div/div/div/div[2]/ul/li")
        for li in li_list:
            name=li.xpath(‘./div/a/@title‘).extract_first()
            detail_url=‘https://www.4567tv.tv‘+li.xpath(‘./div/a/@href‘).extract_first()
            #item实例化的位置
            item=MovieproItem()   #通过该meta传递item
            item[‘name‘]=name
            #对详情页的url发起get请求
            #请求传参:meta参数对应的字典就可以传递给请求对象中指定好的回调函数
            yield scrapy.Request(url=detail_url,callback=self.detail_parse,meta={‘item‘:item})
    #解析详情页的页面数据
    def detail_parse(self,response):
        #回调函数内部通过response.meta就可以接收到请求传参传递过来的字典
        item=response.meta[‘item‘]
        desc=response.xpath(‘/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()‘).extract_first()
        item[‘desc‘]=desc
        yield item

下面在管道中打印一下item

在settings中开启管道

执行一下爬虫文件:

这个时候,我们已经得到了第一页的数据

如何爬取其他页面数据?

# -*- coding: utf-8 -*-
import scrapy
from moviePro.items import MovieproItem

class MovieSpider(scrapy.Spider):
    name = ‘movie‘
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [‘https://www.4567tv.tv/frim/index1.html‘]
    #爬取电影名称(首页),简介(详情)
    #通用的url模板只适用于非第一页
    url=‘https://www.4567tv.tv/frim/index1-%d.html‘
    page=2
    def parse(self, response):
        li_list=response.xpath("/html/body/div[1]/div/div/div/div[2]/ul/li")
        for li in li_list:
            name=li.xpath(‘./div/a/@title‘).extract_first()
            detail_url=‘https://www.4567tv.tv‘+li.xpath(‘./div/a/@href‘).extract_first()
            #item实例化的位置
            item=MovieproItem()   #通过该meta传递item
            item[‘name‘]=name
            #对详情页的url发起get请求
            #请求传参:meta参数对应的字典就可以传递给请求对象中指定好的回调函数
            yield scrapy.Request(url=detail_url,callback=self.detail_parse,meta={‘item‘:item})
        if self.page<5:
            new_url=format(self.url%self.page)
            self.page+=1
            yield scrapy.Request(url=new_url,callback=self.parse)   #这个地方发起请求,怎样走的下一步的详情页???
    #解析详情页的页面数据
    def detail_parse(self,response):
        #回调函数内部通过response.meta就可以接收到请求传参传递过来的字典
        item=response.meta[‘item‘]
        desc=response.xpath(‘/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()‘).extract_first()
        item[‘desc‘]=desc
        yield item

运行:

这样就得到相应的数据

 注意,上边自己调用自己的意思是,重新走了for循环里边的内容

重点内容

原文地址:https://www.cnblogs.com/studybrother/p/10970771.html

时间: 2024-10-31 15:09:10

小爬爬6:2请求传参的相关文章

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

日志等级与请求传参

日志等级: ERROR : 一般错误 WARNING : 警告 INFO : 一般的信息 DEBUG : 调试信息 默认的显示级别是DEBUG 可以在配置文件中settings中进行日志信息的指定输出:#指定日志信息的输出#LOG_LEVEL = 'DEBUG' #将日志信息写入到文件中进行存储LOG_FILE = 'log.txt' 二.请求传参 - 在某些情况下,我们爬取的数据不在同一个页面中,例如,我们爬取一个电影网站,电影的名称,评分在一级页面,而要爬取的其他电影详情在其二级子页面中.这

scrapy框架之日志等级和请求传参

一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 WARNING : 警告 INFO : 一般的信息 DEBUG : 调试信息 默认的显示级别是DEBUG - 设置日志信息指定输出: 在settings.py配置文件中,加入LOG_LEVEL = ‘指定日志信息种类’即可.LOG_FILE = 'log.txt'则表示将日志信息写入到指定文件中进行

爬虫之post请求与请求传参

一.POST请求 class Postspider(scripy.Spider): name = "post" # allowed_domains = ["www.xxx.com"] start_urls = ["https.//fanyi.baidu.com/sug"] def start_requests(self): data = { "kw": "dog" } for url in self.sta

爬虫scrapy组件 请求传参,post请求,中间件

post请求 在scrapy组件使用post请求需要调用 def start_requests(self): 进行传参再回到 yield scrapy.FormRequest(url=url,formdata=data,callback=self.parse)进行post请求 其中FormRequest()为post 请求方式 import scrapy class PostSpider(scrapy.Spider): name = 'post' # allowed_domains = ['ww

scrapy框架的日志等级和请求传参, 优化效率

目录 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 请求传参 如何提高scripy的爬取效率 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. 日志信息的种类: ERROR : 一般错误 WARNING : 警告 INFO : 一般的信息 DEBUG : 调试信息 设置日志信息指定输出: 在settings.py配置文件中,加

【Scrapy框架之请求传参案例】 -- 2019-08-08 20:40:13

原文: http://106.13.73.98/__/141/ 在某些情况下,我们爬取的数据不在同一个页面. 例如下面的案例1,我们要爬取一个电影网站,电影的排名.名称.主演分在一页,而其它的信息分在二级子页面中.这时,我们就需要用到请求传参. 案例1:爬取97电影网中所有热门电影的详细信息 97电影网热门电影URL:http://www.55xia.com/movie/hotest/ 第一步,爬虫文件: # -*- coding: utf-8 -*- import scrapy from Te

11-scrapy(递归解析,post请求,日志等级,请求传参)

一.递归解析: 需求:将投诉_阳光热线问政平台中的投诉标题和状态网友以及时间爬取下来永久储存在数据库中 url:http://wz.sun0769.com/index.php/question/questionType?type=4&page= 需求分析:每一个页面对应的是一个url,scrapy框架发起请求对一个url进行解析,解析完后又对另一个url发起请求进行解析. 实现方案: 1.可以将每一个页面的url放在爬虫程序中的start_urls中请求.(不推荐,累死人) 2.另一种请求使用R

python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件

# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' 一丶scrapy的图片数据爬取(流数据的爬取) ? scrapy中封装好了一个管道类(ImagesPipeline),基于该管道类可以实现图片资源的请求和持久化存储 编码流程: 爬虫文件中解析出图片的地址 将