scrapy 请求传参

1.定义数据结构item.py文件

  1. '''
  2. field: item.py
  3. '''
  4. # -*- coding: utf-8 -*-
  5. # Define here the models for your scraped items
  6. #
  7. # See documentation in:
  8. # https://doc.scrapy.org/en/latest/topics/items.html
  9. import scrapy
  10. class MovieprojectItem(scrapy.Item):
  11. # define the fields for your item here like:
  12. # name = scrapy.Field()
  13. # 电影海报
  14. # 一级页面要抓取的内容
  15. post = scrapy.Field()
  16. name = scrapy.Field()
  17. _type = scrapy.Field()
  18. # 二级页面要抓取的内容
  19. director = scrapy.Field()
  20. design = scrapy.Field()
  21. actor = scrapy.Field()
  22. info = scrapy.Field()

2.爬虫文件

  1. # -*- coding: utf-8 -*-
  2. # -*- coding: utf-8 -*-
  3. import scrapy
  4. from movieproject.items import MovieprojectItem
  5. class MovieSpider(scrapy.Spider):
  6. name = 'movie'
  7. allowed_domains = ['www.id97.com']
  8. start_urls = ['http://www.id97.com/movie/']
  9. url = 'http://www.id97.com/movie/?page={}'
  10. page = 1
  11. '''
  12. (1)只需要提取页码链接,只提取第一页的信息即可
  13. (2)需要写两个规则,一个规则提取详情页面,一个规则是提取页码链接
  14. '''
  15. def parse(self, response):
  16. # 先查找所有的movie_div
  17. movie_div_list = response.xpath('//div[starts-with(@class,"col-xs-1-5")]')
  18. # 遍历所有的div,去获取每一个详细的信息
  19. for odiv in movie_div_list:
  20. item = MovieprojectItem()
  21. # 获取电影海报
  22. item['post'] = odiv.xpath(".//img/@data-original").extract_first()
  23. # 获取电影名字
  24. item['name'] = odiv.xpath("./div/div/h1/a/text()").extract_first()
  25. # 获取电影类型
  26. item['_type'] = odiv.xpath("./div/div/div/a/text()").extract()
  27. # 获取详情页面
  28. detail_href = odiv.xpath('./div/a/@href').extract_first()
  29. '''
  30. 向详情页面发送请求
  31. 将item向二级传递过去,到二级页面接受并且接着提取其他的信息
  32. 请求二级详情页面,解析二级页面中的相应内容,通过meta参数进行Request的数据传
  33. '''
  34. yield scrapy.Request(url=detail_href,callback=self.parse_detail, meta={'item': item})
  35. # 爬取其他页面
  36. if self.page <= 5:
  37. self.page += 1
  38. url = self.url.format(self.page)
  39. print(url)
  40. yield scrapy.Request(url=url, callback=self.parse)
  41. def parse_detail(self,response):
  42. # 首先获取到上一级传递过来的item
  43. item = response.meta['item']
  44. # 在这个页面中接着提取电影的其它信息即可
  45. # 获取导演
  46. item['director'] = response.xpath("//div[starts-with(@class,'col-xs-8')]/table/tbody/tr/td[2]/a/text()").extract()
  47. # 获取编剧
  48. item['design'] = response.xpath("//div[starts-with(@class,'col-xs-8')]/table/tbody/tr[2]/td[2]/a/text()").extract()
  49. # 获取主演
  50. item['actor'] = response.xpath("//div[starts-with(@class,'col-xs-8')]/table/tbody/tr[3]/td[2]/a/text()").extract()
  51. # 获取电影介绍
  52. item['info'] = response.xpath("//div[@class='col-xs-12 movie-introduce']/p/text()").extract_first()
  53. #提交item到管道
  54. yield item

3.管道文件

  1. # -*- coding: utf-8 -*-
  2. '''
  3. filed: pipelines.py
  4. '''
  5. # -*- coding: utf-8 -*-
  6. # Define your item pipelines here
  7. #
  8. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  9. # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
  10. import json
  11. from scrapy.utils.project import get_project_settings
  12. import pymysql
  13. class MovieprojectPipeline(object):
  14. def open_spider(self,spider):
  15. self.fp = open("movie.json","w",encoding="utf8")
  16. def process_item(self, item, spider):
  17. obj = dict(item)
  18. string = json.dumps(obj,ensure_ascii=False)
  19. self.fp.write(string+'\n')
  20. # print("写入成功")
  21. return item
  22. def close_spider(self,spider):
  23. self.fp.close()
  24. class MovieMysqlPipeline(object):
  25. def open_spider(self,spider):
  26. # 获取所有的配置信息
  27. settings = get_project_settings()
  28. # 链接数据库
  29. host = settings['DB_HOST']
  30. port = settings['DB_PORT']
  31. user = settings['DB_USER']
  32. pwd = settings['DB_PWD']
  33. name = settings['DB_NAME']
  34. charset = settings['DB_CHARSET']
  35. self.conn = pymysql.connect(host=host, port=port, user=user, password=pwd, db=name, charset=charset)
  36. def process_item(self, item, spider):
  37. # 拼接sql语句
  38. sql = 'insert into movie(post, name, type, director, design, actor, info) values("%s","%s","%s","%s","%s","%s","%s")' % (item['post'], item['name'], item['_type'], item['director'], item['design'], item['actor'], item['info'])
  39. # 获取游标
  40. cursor = self.conn.cursor()
  41. # 执行sql语句
  42. try:
  43. cursor.execute(sql)
  44. self.conn.commit()
  45. except Exception as e:
  46. self.conn.rollback()
  47. return item
  48. def close_spider(self,spider):
  49. # 关闭数据库
  50. self.conn.close()

scrapy (三) : 请求传参的更多相关文章

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

    post请求 在scrapy组件使用post请求需要调用 def start_requests(self): 进行传参再回到 yield scrapy.FormRequest(url=url,form ...

  2. scrapy基于请求传参实现深度爬取

    请求传参实现深度爬取 请求传参: 实现深度爬取:爬取多个层级对应的页面数据 使用场景:爬取的数据没有在同一张页面中 在手动请求的时候传递item:yield scrapy.Request(url,ca ...

  3. 13.scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是s ...

  4. scrapy框架的日志等级和请求传参

    日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息 ...

  5. scrapy框架之日志等级和请求传参-cookie-代理

    一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 ...

  6. scrapy框架post请求发送,五大核心组件,日志等级,请求传参

    一.post请求发送 - 问题:爬虫文件的代码中,我们从来没有手动的对start_urls列表中存储的起始url进行过请求的发送,但是起始url的确是进行了请求的发送,那这是如何实现的呢? - 解答: ...

  7. 13,scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy ...

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

    # settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, l ...

  9. 12 Scrapy框架的日志等级和请求传参

    一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 ...

随机推荐

  1. Mbatis使用

    Mybatis的搭建过程 导入jar 创建mybatis的核心(全局)配置文件mybatis-config.xml,并配置 <?xml version="1.0" encod ...

  2. 【loj - 6516】「雅礼集训 2018 Day11」进攻!

    目录 description solution accepted code details description 你将向敌方发起进攻!敌方的防御阵地可以用一个 \(N\times M\) 的 \(0 ...

  3. Ubuntu18.04下使用Hexo框架搭建个人博客

    一.安装node.js 说明:安装node.js的原因:Hexo框架是基于node.js. 1.推荐使用nvm安装速度快,也可自行百度其它方法. wget -qO- https://raw.githu ...

  4. (二)Java编程基础

    目录 一.关键字与保留字 二.标识符与变量 三.基本数据类型的转换 四.运算符 五.分支语句 五.循环语句 六.跳转语句 七.Java从键盘读取输入 一.关键字与保留字 定义:①关键字:Java关键字 ...

  5. (五)application/x-www-form-urlencoded(表单请求)

    原文链接:https://blog.csdn.net/justry_deng/article/details/81042379

  6. LR脚本信息函数-lr_get_vuser_ip

    lr_get_vuser_ip 返回Vuser的IP地址. char * lr_get_vuser_ip(); lr_get_vuser_ip函数返回Vuser的IP地址. 当执行IP欺骗时,每个Vu ...

  7. 囚徒问题(100 prisoners problem)的python验证

    密码学课上老师介绍了这样一个问题,囚徒问题(100 prisoners problem):一百个囚徒被关在牢房里,典狱长给他们最后一次机会,100人依次进入一个有100个抽屉的牢房,每个抽屉置乱放入1 ...

  8. 【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean

    写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,可以使用@Import注解快速向容器中导入bean,小伙伴们可以参见<[Spring注解驱动开发] ...

  9. 【JMeter_11】JMeter逻辑控制器__Switch控制器<Switch Controller>

    Switch控制器<Switch Controller> 业务逻辑: 取得switch value的值,通过对节点下所有取样器.逻辑控制器的下标.名称匹配去执行,switch value的 ...

  10. Java多线程与并发基础

    CS-LogN思维导图:记录专业基础 面试题 开源地址:https://github.com/FISHers6/CS-LogN 多线程与并发基础 实现多线程 面试题1:有几种实现线程的方法,分别是什么 ...