1、通过pipelines操作拿到的数据

要点一:爬虫文件必须通过关键字yield生成器才能与pipelines建立链接才可以操作,当运行爬虫文件之后执行的顺序如下图简介,如果重写模块或者内部方法可能会造成麻烦,往下翻阅可以看到open_spider()之后,开始执行爬虫文件close_spider()关闭爬虫文件,scrapy之间执行的顺序类似与函数嵌套的执行,即爬虫模块嵌套pipeline模块

要点二:先打开文件,在操作文件,关闭文件,需要注意的是多管道之间的优先级是setting当中建立管道时数字给的大小的建立,越小优先级越高,二级管道如果不指定来源则操作的是一级管道的数据,一级管道如果没有return返回则二级管道没有数据可以操作

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import jsonclass MyspiderPipeline:def __init__(self):self.f = open('demo.json', 'w', encoding='utf-8')def open_spider(self, itme):print('爬虫开始了')def process_item(self, item, spider):# print('1'*10)# print(spider.name)item['age'] = '18'item_json = json.dumps(item,ensure_ascii=False)self.f.write(item_json+'\n')# item['age'] = '18' # 不行,已经写进去了# print(item)# print('1'*20)# return item # 管道之间的链接通过return返回的数据进行链接如果没有,低级管道则操控不了高级管道的数据def close_spider(self, item):print('爬虫结束了')self.f.closeclass MyspiderPipeline1:def process_item(self, item, spider):if spider.name == 'don': # 没有提示直接写if isinstance(item,Demo2Item):print('可以的')# print(spider.name)print('0'*20)print(item)# 11111111111111111111 结果# 00000000000000000000# {"name": "影讯&购票", "age": "18"}

2、loggin模块的使用

为了将可能发现的错误信息保存到文件当中,方便查看,哪个模块可能出错就去那个模块设置logging
第一步:操作可能出错的模块

import scrapy
import logginglogger = logging.getLogger(__name__)
class JdSpider(scrapy.Spider):name = 'jd'allowed_domains = ['jd.com']start_urls = ['http://jd.com/']def parse(self, response):# logging.warning('this is warning')# print(__name__)logger.warning('this is warning')

第二步:操作settingLOG_FILE = './LOG.log'将错误信息保存在当前文件下的log文件当中 还有一种模块方法不用操作setting只用操作第一步以及在scrapy中任意位置新建如下模块即可

import logginglogging.basicConfig(# level=log_level,level = logging.INFO,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S',filename='parser_result.log',filemode='w')

3、腾讯爬虫案例

创建项目
scrapy startproject tencent
创建爬虫
scrapy genspider hr tencent.com

3.1scrapy.Request知识点

scrapy.Request(url, callback=None, method='GET', headers=None, body=None,cookies=None, meta=None, encoding='utf-8', priority=0,
dont_filter=False, errback=None, flags=None)常用参数为:
callback:指定传入的URL交给那个解析函数去处理
meta:实现不同的解析函数中传递数据,meta默认会携带部分信息,比如下载延迟,请求深度
dont_filter:让scrapy的去重不会过滤当前URL,scrapy默认有URL去重功能,对需要重复请求的URL有重要用途

3.2详细爬虫代码

注意:要在setting中设置显示标准LOG_LEVEL = 'WARNING'

import scrapy
# 列表页面
# https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1597974603010&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex=1&pageSize=10&language=zh-cn&area=cn# 详情页面
# https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=1597974781014&postId=1254638329626894336&language=zh-cn
class HrSpider(scrapy.Spider):name = 'hr'allowed_domains = ['tencent.com']first_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1597974603010&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex={}&pageSize=10&language=zh-cn&area=cn'second_url = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=1597974781014&postId={}&language=zh-cn'start_urls = [first_url.format(1)]def parse(self, response):for page in range(1,3):url = self.first_url.format(page)yield scrapy.Request(url,callback=self.parse_first)def parse_first(self,response):data = response.json()page = data['Data']['Posts']item = {}for job in page:job_index = job['PostId']# print(job_index)item['job_name'] = job['CategoryName']detail_url = self.second_url.format(job_index)yield scrapy.Request(detail_url,meta={'item':item},callback=self.parse_second)def parse_second(self,response):item = response.meta['item']# item = response.get('item')data = response.json()item['zhi_duty'] = data['Data']['Requirement']item['zhi_bility'] = data['Data']['Responsibility']print(item)

4、items的使用

在爬虫中可以字定义字典来使用保存数据的方法,为了高耦合,让items来定义你想要提取的哪些内容,通过爬虫导入items当中的类来实现高耦合,
语法

import scrapy
class Demo2Item(scrapy.Item):# define the fields for your item here like:#  name = scrapy.Field() 这是模板,name代表字典的key,也就是你想提取的数据是什么,后面的代表以key来创建字典,这是scrapy封装的方法,不用深究,我们需要理解的就是它是以name为key创建字典job_name = scrapy.Field()   zhi_duty = scrapy.Field()zhi_bility = scrapy.Field()

使用
在爬虫模块导入items这个模块,再实例化items里面的类,实例化对象就可以当成一个有key的空字典使用,如下,虽然还是用字典的方式添加key和value,但是你不用定义字典了,并且,添加字典时必须是items里面定义的key,不能不一样比如你items定义的是job_name1,此时你就不能用job_name必须使用job_name1,另外爬虫的键值对不能多,但可以少,返回的是你爬虫根据item定义的字典提取的东西,提取多少就返回多少,这就是items创建字典与普通创建的区别,

它们打印的结果也有一些细微的区别,见下图

阳光政务平台实现步骤小案例

import scrapy
from demo2.items import YgItemclass YgSpider(scrapy.Spider):name = 'yg'allowed_domains = ['wz.sun0769.com/']start_urls = ['http://wz.sun0769.com/political/index/politicsNewest?id=1&type=4']def parse(self, response):item = YgItem()# item={}li_list = response.xpath("//ul[@class='title-state-ul']/li")for li in li_list:item['title'] = li.xpath("./span[3]/a/text()").extract_first()  # 标题item['href'] = 'http://wz.sun0769.com' + li.xpath("./span[3]/a/@href").extract_first()  # 详情页的urlyield scrapy.Request(item['href'],callback=self.parse_detail,meta={'item':item},)# print(item)# next_url = 'http://wz.sun0769.com' + response.xpath(#     "//div[@class='mr-three paging-box']/a[2]/@href").extract_first()# for url in next_url:#     yield scrapy.Request(url, callback=self.parse)def parse_detail(self, response):# response.xpath()item = response.meta['item']# item = response.meta.get('item')print(item)item['content'] = response.xpath("//div[@class='details-box]/pre/text()").extract_first()print(item)# yield item

python爬虫十二:初步使用Scrapy框架爬取数据相关推荐

  1. Python爬虫入门实例九之Scrapy框架爬取股票信息(亲测有效)

    文章目录 写在前面 一.准备工作 二.具体步骤 1.建立工程和Spider模板 2.编写Spider 3.编写pipelines 4.更改settings 5.运行爬虫 三.注意事项 1.文件内容为空 ...

  2. Scrapy框架爬取数据

    因为对爬虫有着很大的好奇心,所以又找了一些资料继续开始了学习之旅. 文章目录 一.Scrapy框架简介 二.爬取网络数据 2.1爬取单个网页数据 2.2爬取多个网页数据 三.一些小方法 四.小结 一. ...

  3. python爬虫库scrapy_使用Python爬虫Scrapy框架爬取数据

    时隔数月,国庆期间想做个假期旅游的分析展示. 1.通过Python爬取旅游网站上数据,并存储到数据库 2.通过Echart/FineReport/Superset等数据分析工具对数据展示 环境: Wi ...

  4. Python爬虫实战(三):定时爬取数据存入SqlServer

    目录

  5. Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB

    ​    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...

  6. Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB

    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...

  7. python爬虫十二种方法_Python爬虫的N种姿势

    问题的由来 前几天,在微信公众号(Python爬虫及算法)上有个人问了笔者一个问题,如何利用爬虫来实现如下的需求,需要爬取的网页如下(网址为:https://www.wikidata.org/w/in ...

  8. Python爬虫 scrapy框架爬取某招聘网存入mongodb解析

    这篇文章主要介绍了Python爬虫 scrapy框架爬取某招聘网存入mongodb解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建项目 sc ...

  9. python爬虫教程:Scrapy框架爬取Boss直聘网Python职位信息的源码

    今天小编就为大家分享一篇关于Scrapy框架爬取Boss直聘网Python职位信息的源码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 分析 使用Crawl ...

最新文章

  1. Android View 测量流程(Measure)完全解析
  2. webService——学习(3):使用JDK开发webService
  3. 移动超级sim卡 无法下载卡_中国移动发布超级SIM卡:全变了
  4. [转载] Java笔试题集锦
  5. 使用 Redis 如何实现延迟队列?
  6. 容器化时代到来!跳转机分配问题终于“有救”了
  7. 移植RTT使用cubeMx配置后出现 cannot open source input file stm32f1xx_hal_exti.h: No such file or directory
  8. java 华氏度_在Java中将华氏度转换为摄氏温度[重复] - java
  9. 算法笔记_面试题_19.链表_模板及示例十几道
  10. 江湖传说——阿里巴巴土话102句完整版
  11. 光模块测试CEI-28G-VSR 浅析1---背景基础介绍
  12. IcedTea:首个100%兼容、开源的Java
  13. 抽象代数笔记-环、域、扩域、伽罗瓦理论
  14. c语言单片机红外报警设计,超级简单单片机红外感应开关DIY设计
  15. CMS企业建站的经验
  16. win7系统中的消息队列服务器,高手分析win7系统安装消息队列的详细
  17. java 访问 domino_java程序远程访问Domino数据库简例
  18. AGV自导航机器人执行的安全标准
  19. 汇编程序:查表求平方
  20. 强制删除windows文件的终极解决方法

热门文章

  1. docker使用和搭建
  2. SPI接口的MISO和MOSI连接时是否需要交叉接? SI和SO呢?
  3. 【vscode】常用快捷键
  4. Android 如何OTG 鼠标,otg键盘和鼠标映射软件v5.2.0 Android版
  5. matlab 改变坐标轴间距,matlab坐标轴刻度间距
  6. Word2007设置标题序号与标题文字之间自动空一个字距
  7. 创建jira sprint_如何在Excel中创建高级sprint燃尽图
  8. (三)Animation创建动画
  9. 如何利用Python教你如何爬取高德地图!非常全面啊!
  10. C++初阶学习————二叉树进阶(二叉搜索树)