scrapy (三) : 请求传参
scrapy 请求传参
1.定义数据结构item.py文件
'''
field: item.py
'''
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class MovieprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 电影海报
# 一级页面要抓取的内容
post = scrapy.Field()
name = scrapy.Field()
_type = scrapy.Field()
# 二级页面要抓取的内容
director = scrapy.Field()
design = scrapy.Field()
actor = scrapy.Field()
info = scrapy.Field()
2.爬虫文件
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import scrapy
from movieproject.items import MovieprojectItem
class MovieSpider(scrapy.Spider):
name = 'movie'
allowed_domains = ['www.id97.com']
start_urls = ['http://www.id97.com/movie/']
url = 'http://www.id97.com/movie/?page={}'
page = 1
'''
(1)只需要提取页码链接,只提取第一页的信息即可
(2)需要写两个规则,一个规则提取详情页面,一个规则是提取页码链接
'''
def parse(self, response):
# 先查找所有的movie_div
movie_div_list = response.xpath('//div[starts-with(@class,"col-xs-1-5")]')
# 遍历所有的div,去获取每一个详细的信息
for odiv in movie_div_list:
item = MovieprojectItem()
# 获取电影海报
item['post'] = odiv.xpath(".//img/@data-original").extract_first()
# 获取电影名字
item['name'] = odiv.xpath("./div/div/h1/a/text()").extract_first()
# 获取电影类型
item['_type'] = odiv.xpath("./div/div/div/a/text()").extract()
# 获取详情页面
detail_href = odiv.xpath('./div/a/@href').extract_first()
'''
向详情页面发送请求
将item向二级传递过去,到二级页面接受并且接着提取其他的信息
请求二级详情页面,解析二级页面中的相应内容,通过meta参数进行Request的数据传
'''
yield scrapy.Request(url=detail_href,callback=self.parse_detail, meta={'item': item})
# 爬取其他页面
if self.page <= 5:
self.page += 1
url = self.url.format(self.page)
print(url)
yield scrapy.Request(url=url, callback=self.parse)
def parse_detail(self,response):
# 首先获取到上一级传递过来的item
item = response.meta['item']
# 在这个页面中接着提取电影的其它信息即可
# 获取导演
item['director'] = response.xpath("//div[starts-with(@class,'col-xs-8')]/table/tbody/tr/td[2]/a/text()").extract()
# 获取编剧
item['design'] = response.xpath("//div[starts-with(@class,'col-xs-8')]/table/tbody/tr[2]/td[2]/a/text()").extract()
# 获取主演
item['actor'] = response.xpath("//div[starts-with(@class,'col-xs-8')]/table/tbody/tr[3]/td[2]/a/text()").extract()
# 获取电影介绍
item['info'] = response.xpath("//div[@class='col-xs-12 movie-introduce']/p/text()").extract_first()
#提交item到管道
yield item
3.管道文件
# -*- coding: utf-8 -*-
'''
filed: pipelines.py
'''
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import json
from scrapy.utils.project import get_project_settings
import pymysql
class MovieprojectPipeline(object):
def open_spider(self,spider):
self.fp = open("movie.json","w",encoding="utf8")
def process_item(self, item, spider):
obj = dict(item)
string = json.dumps(obj,ensure_ascii=False)
self.fp.write(string+'\n')
# print("写入成功")
return item
def close_spider(self,spider):
self.fp.close()
class MovieMysqlPipeline(object):
def open_spider(self,spider):
# 获取所有的配置信息
settings = get_project_settings()
# 链接数据库
host = settings['DB_HOST']
port = settings['DB_PORT']
user = settings['DB_USER']
pwd = settings['DB_PWD']
name = settings['DB_NAME']
charset = settings['DB_CHARSET']
self.conn = pymysql.connect(host=host, port=port, user=user, password=pwd, db=name, charset=charset)
def process_item(self, item, spider):
# 拼接sql语句
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'])
# 获取游标
cursor = self.conn.cursor()
# 执行sql语句
try:
cursor.execute(sql)
self.conn.commit()
except Exception as e:
self.conn.rollback()
return item
def close_spider(self,spider):
# 关闭数据库
self.conn.close()
scrapy (三) : 请求传参的更多相关文章
- 爬虫scrapy组件 请求传参,post请求,中间件
post请求 在scrapy组件使用post请求需要调用 def start_requests(self): 进行传参再回到 yield scrapy.FormRequest(url=url,form ...
- scrapy基于请求传参实现深度爬取
请求传参实现深度爬取 请求传参: 实现深度爬取:爬取多个层级对应的页面数据 使用场景:爬取的数据没有在同一张页面中 在手动请求的时候传递item:yield scrapy.Request(url,ca ...
- 13.scrapy框架的日志等级和请求传参
今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是s ...
- scrapy框架的日志等级和请求传参
日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息 ...
- scrapy框架之日志等级和请求传参-cookie-代理
一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 ...
- scrapy框架post请求发送,五大核心组件,日志等级,请求传参
一.post请求发送 - 问题:爬虫文件的代码中,我们从来没有手动的对start_urls列表中存储的起始url进行过请求的发送,但是起始url的确是进行了请求的发送,那这是如何实现的呢? - 解答: ...
- 13,scrapy框架的日志等级和请求传参
今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy ...
- python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件
# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, l ...
- 12 Scrapy框架的日志等级和请求传参
一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 ...
随机推荐
- Mbatis使用
Mybatis的搭建过程 导入jar 创建mybatis的核心(全局)配置文件mybatis-config.xml,并配置 <?xml version="1.0" encod ...
- 【loj - 6516】「雅礼集训 2018 Day11」进攻!
目录 description solution accepted code details description 你将向敌方发起进攻!敌方的防御阵地可以用一个 \(N\times M\) 的 \(0 ...
- Ubuntu18.04下使用Hexo框架搭建个人博客
一.安装node.js 说明:安装node.js的原因:Hexo框架是基于node.js. 1.推荐使用nvm安装速度快,也可自行百度其它方法. wget -qO- https://raw.githu ...
- (二)Java编程基础
目录 一.关键字与保留字 二.标识符与变量 三.基本数据类型的转换 四.运算符 五.分支语句 五.循环语句 六.跳转语句 七.Java从键盘读取输入 一.关键字与保留字 定义:①关键字:Java关键字 ...
- (五)application/x-www-form-urlencoded(表单请求)
原文链接:https://blog.csdn.net/justry_deng/article/details/81042379
- LR脚本信息函数-lr_get_vuser_ip
lr_get_vuser_ip 返回Vuser的IP地址. char * lr_get_vuser_ip(); lr_get_vuser_ip函数返回Vuser的IP地址. 当执行IP欺骗时,每个Vu ...
- 囚徒问题(100 prisoners problem)的python验证
密码学课上老师介绍了这样一个问题,囚徒问题(100 prisoners problem):一百个囚徒被关在牢房里,典狱长给他们最后一次机会,100人依次进入一个有100个抽屉的牢房,每个抽屉置乱放入1 ...
- 【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean
写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,可以使用@Import注解快速向容器中导入bean,小伙伴们可以参见<[Spring注解驱动开发] ...
- 【JMeter_11】JMeter逻辑控制器__Switch控制器<Switch Controller>
Switch控制器<Switch Controller> 业务逻辑: 取得switch value的值,通过对节点下所有取样器.逻辑控制器的下标.名称匹配去执行,switch value的 ...
- Java多线程与并发基础
CS-LogN思维导图:记录专业基础 面试题 开源地址:https://github.com/FISHers6/CS-LogN 多线程与并发基础 实现多线程 面试题1:有几种实现线程的方法,分别是什么 ...