1:piplines的使用
- piplines:管道文件,用于保存从爬虫文件返回来的数据
- 保存爬虫文件返回的数据,可以在爬虫文件中写,也可以在piplines中写,但是scrapy推荐的是在piplines中写保存爬虫返回的数据
1.1:怎样使用piplines来保存爬虫返回的数据
- 前提:爬虫文件在爬虫文件中,可以在爬虫文件中打印返回的数据,保证没有问题之后在向piplines文件编写中保存数据
1.2:步骤
- 1:在setting文件中,把控制管道的代码打开。原来是注释的样子,只有打开被注释的管道代码才可以使用piplines来编写保存逻辑
- 2:会到爬虫文件当中,把需要的数据通过生成器函数的样子返回,返回数据给管道,也就是通过yield的返回值返回数据给管道
- 使用生成器函数的好处:
- 1:不会浪费内存
- 2:可以实现翻页的逻辑,在scrapy框架内部中提供了翻页的方式,
scrapy.Requst(url, callback...)
- 当中url为每一页的url,callback为回调函数
- 通过yield来返回Request对象
- 3:在piplines中编写保存数据的逻辑
def __init__(self):
"""写入数据的先前工作,比如打开文件"""
...
def open_spider(self):
"""爬虫开始之前的函数,比如可以写:爬虫开始了"""
...
def close_spide(self):
"""爬虫结束时候的函数,比如可以写:爬虫结束了"""
...
- 4:在process_item方式中编写要保存数据的逻辑
- 注意:在Python中写入文件的数据类型为字符串类型,所以有的时候需要使用强制类型转换类改变数据类型
- 也可以使用JSON模块,把Python的字典数据;类型转换为JSON的字符数据类型
- 该函数的返回值,只有在调用该函数的时候才或出现,要是在代码中我们不需要该函数的返回值,可以不调用,或者返回值注释掉
- 5:process_item函数参数的解释
- item:数据的来源,也就是要保存的数据,数据是从爬虫文件过来的
- spider:爬虫本身
- 返回爬虫的名字:spider.name
1.3:多个管道的开启
- 可以在settin.py文件中的管道那一段的代码中添加多个管道
- 也可以自己从写一个管道
- 在setting.py文件中的管道代码的字典中,后面的数字越小管道的优先级越高
- 开启多管道的好处:可以一个管道保存一个数据类型,这样可以方便管理
2:items文件的讲解
2.1:items文件的作用
2.2:如何使用items文件
- 可以在爬虫文件中引用items文件,使用导包的形式引入items文件中的类
- item文件中的Field类的父类就是python的dict类,所以说,Field的实例对象就是字典类型
- 然后再实例化对象
方法二:使用关键字的形式调用items文件中的类
- 在爬虫文件中的Field类的实例对象可以通过关键字参数的形式来调用items文件中提前封装的字典
2.3:使用item文件需要注意的事
- 在爬虫文件和items文件中的字典的key值要一直,要不然在爬虫文件中找不到items文件中字典
3:使用items文件是如何保存数据
- 因为调用了items文件,item此时已经不是一个字典的类型了,而是一个对象的类型了,所以不能通过str()函数来进行强制类型转换,但是可以通过json.dump来把item对象转换为JSON类型的字符串数据,然后再写入到文件中
- 使用上述的方法时候,会发现写入文件的数据都是16进制的字节流,这是因为,当写入的数据不是英文的时候,就会把不是英文的字符转换为16进制的字节流,所以要在JSON.dump()函数中把。ensure_ascll改为FALSE
4:在scrapy中如何使用翻页操作
4.1:方法一:在网页源码中寻找下一页的url
- 可以使用xpath得到下一页的url地址,但是有的时候得到的url地址是不全的,这个时候就需要使用拼串操作了
- 1:可以使用Requst.urljoin(url),可以把不全的url改为全的url
- 2:可以使用字符串的拼接操作,来把缺失的url给拼接完全
4.2:翻页操作
requset = scrapy.Request(url, callback=a)
yeild request
- 代码解释
- Request()方法:实施翻页的方法,url为新一页的url
- yield:把翻页后的url发送给引擎,进行新一轮的数据爬取
- callback:回调函数,也就是新一页的数据如何进行解析,要是新页面的数据结构和现在页面的数据结构一样的话就可以使用这个函数,但是要是不一样的话就需要写新的解析函数了
- 操作现象
- 如果解析函数解析出来了行的url,就进行爬取新的url操作和解析,但是如果没有新的url就停止
5:setting文件的补充
- setting文件中,主要的都是一些配置项,由于存放一些公共属性
- setting文件可以没有,但是要自己写一个配置项的文件
- 当一些公共的属性不知道存放在哪里的时候,就可以写在setting晚文件中,在别的文件需要用的时候,就可以使用导包的形式进行导入到该文件中
- 导入文件的方式一:使用[]的形式引用
- 导入方式二:使用get()方法引用
6: middlewares文件
- 在这个文件当中,有两个类,一个是爬虫中间件了类,一个是下载中间件的类
- 其中的下载中间件可以设置随机Ua
6.1:为什么么要子啊middlewares中写随机UA
- 在setting文件当中也可以设置随机UA,按时前面说过setting文件当中只是封装了一些配置项,不好写一些逻辑所以要在middlewares文件中写随机UA的逻辑
6.2:爬虫中间件和下载中间件介绍
6.2.1下载中间件
下载中间件、引擎和下载器之间的关系
- 下载中间件用于连接引擎和下载器数据的中间件
- 下载中间件用于连接引擎和下载器之间的中间件,可以在这个文件当中设置代理Ip,随机UA达到反反爬的目的
- 在实现反反爬的逻辑的时候需要使用两个方法:process_request()方法、process_response()方法
6.2.2:process_request()方法***
- 当request通过下载中间件的时候,该方法调用
- 方法全部:process_request(self, request, spider)
- request:拦截的请求
- spider:爬虫的实例化对象
process_request()方法的返回值
- 1:返回None
- 正常操作,正常处理request方法,执行相应的方法(process_request()方法)
- 2:返回response
- 就是下载中间件直接把response直接返回给了引擎,而不是通过下载器返回的response数据
- 3:返回request
- 就是下载中间件把自己的返回值给下载器器,下载器通过这个request去获得响应的数据,而不是引擎发过来的request请求的响应
- 注意不要搞别人的这个方法
6.2.3:process_response()方法
- 当下载器完成HTTP请求的时候,该方法调用
- 方法全部:process_response(self, response, spider)
6.2.4:爬虫中间件
- 爬虫中间件用于连接引擎和爬虫文件的中间件
- 这个文件不是很重要,所以在这里就不多讲了
6.3:使用middlewares完成随机UA
- 步骤
- 1:在setting文件中开启下载文件件的注释
- 2:在下载中间件中完成随机UA
- 3:重写process_request()
- 在原本的方法上改
- 自己写一个方法,然后再setting文件中改变这个方法
- 4:实现随机UA
- 可以在网上找UA大全,然后使用一个列表来获取一个UA
- 可以使用Falk_UserAgent()类
- 备注:random.choice(a)
- 5:返回UA:request.headers[‘User_agent’] = 随机的UA
- 6:连续向一个网址发起请求,yield scrapy.request(url=self.url)
- 注意:
- 1:使用发起请求的url是一个字符型,所以当获得数据不是字符型的时候要先转换为字符型,在发起请求
- 2:这个方法有自动去重大的功能,不去重的方法,dont_filter=True,不去重,反之去重,默认去重
- 7:延迟爬取的速度,可以在setting中修改
6.4:在原来的方法上改有scrapy但是不影响