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

2023-10-28

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 json

class 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.close

class 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 logging

logger = 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 logging


logging.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 YgItem


class 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()  # 详情页的url
            yield 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫十二:初步使用Scrapy框架爬取数据 的相关文章

随机推荐

  • v-model的使用

    目录 一 v model 的原理 二 v model 结合radio 使用 三 v model 结合checkbox 类型单选使用 四 v model 结合checkbox 多选使用 五 v model 结合select 使用 六 v mo
  • 消灭兔子【贪心+堆】

    题目链接 51nod 1191 消灭兔子 兔子这么可爱 怎么能消灭呢 我们可以用贪心的办法来解决这个问题 因为每个箭只能使用一次 所以 我们将兔子血量从高往低排列 先做掉高血量兔子 然后再看低血量兔子 保证了伤害高但是价值小的武器假如在之前
  • 编程实现RSA数字签名

    一 实验目的 理解RSA数字签名 并运用编程实现RSA数字签名 二 实验过程 1 学习RSA算法及RSA数字签名算法流程 2 RSA数字签名原理 当发送方想要给接收方发送数据 并想进行数字签名的时候 发送方只需要利用自己的私钥 对数据进行数
  • python进阶:线程、进程和协程

    前言 线程 进程和协程都是实现多任务 同一时间可以做多个事情就叫做多任务 的方法 并发 一段时间内做不同的事情 比如一个人吃饭喝水 吃的时候不能喝 喝的时候不能吃 只有在一段时间 吃了再喝或者喝了在吃 并行 同一时间做不同的事情 比如边听音
  • 谈乱序执行和内存屏障

    10多年前的程序员对处理器乱序执行和内存屏障应该是很熟悉的 但随着计算机技术突飞猛进的发展 我们离底层原理越来越远 这并不是一件坏事 但在有些情况下了解一些底层原理有助于我们更好的工作 比如现代高级语言多提供了多线程并发技术 如果不深入下来
  • [Linux]Kali安装Deepin-wine-WeChat

    Kali版本 2022 2 KDE环境 实体机 wget O https deepin wine i m dev setup sh sh apt get install com qq weixin deepin 其他的QQ TIM登录后会崩
  • python PyAV库解析H264视频流及保存指定帧

    PyAV是一个视频处理库 可用于读取 写入和处理视频 要使用PyAV读取视频关键帧 首先需要安装PyAV 可以使用以下命令安装PyAV pip install av 安装完成后 您可以使用以下代码打开视频文件并读取关键帧 import av
  • python数据可视化第八章使用matplotlib绘制高级图表

    使用matplotlib绘制高级图表 1 绘制高等图 等高线图是地形图上高程相等的相邻各点所连成的j闭合曲线 它会将地面上海拔高度相同的点连成环线 之后将环线垂直投影到某一水平面上 并按照 定的比例缩绘到图纸上 常见于山谷 山峰或梯度下降算
  • CloudOS:物联网开发平台,云上开发,边端交付

    什么是物联网 物联网 Internet of Things 简称IoT 是指通过各种信息传感器 射频识别技术 全球定位系统 红外感应器 激光扫描器等各种装置与技术 实时采集任何需要监控 连接 互动的物体或过程 采集其声 光 热 电 力学 化
  • iOS开发中,使用PC查看/修改沙盒文件

    简介 在进行iOS开发中 APP尤其是游戏 在沙盒中可以存放游戏资源包或者数据 例如Json文件 AssetBundle包 在使用服务器下载资源包 存放到本地沙盒中 可以大大减少APP本身的大小 当然 在调试的时候 如果频繁的更换服务器的A
  • 处理告警“ warning #69-D integer conversion resulted in truncation”的方法

    今天分享一个常见的语法告警 就是实参与形参的类型参数对于不上 错误之处 首先我们先看一下告警提示 告警 c 49 warning 69 D integer conversion resulted in truncation 其翻译过来意思就
  • 二 动态SQL和多对一,一对多

    二 动态SQL和多对一 一对多 10 多对一处理 测试环境搭建 按照查询嵌套处理 子查询 按照结果嵌套处理 联表查询 11 一对多 按照结果嵌套处理 按照查询嵌套处理 小结 12 动态 SQL IF choose when otherwis
  • xpath下载安装——Python爬虫xpath插件下载安装(2023.8亲测可用!!)

    目录 1 免费下载插件链接 若失效评论区留言发送最新链接 2023 7亲测可用 2 安装插件 1 打开chrome浏览器页面 点击 右上角三个点 gt 扩展程序 gt 管理拓展程序 若没找到点更多工具 2 打开右上角开发者模式 3 将刚刚下
  • 关于maven创建java-web工程加载过慢如何解决问题

    如何解决maven创建java web工程加载过慢如何解决问题 在创建项目时在这个界面中 添加设置一组变量archetypeCatalog internal 然后点击完成继续创建就可以了 但是这样做每次创建项目都要重复添加 很麻烦 如果大家
  • Spring实现封装自定义注解@Trimmed清除字符串前后的空格

    在Spring中实现字符串清除的方法有很多 原生方法String自带trim 方法 或者使用StringUtils提供的trim 方法 通常可以将上面的方式封装成自定义注解的形式去实现来节省更多的业务代码 Trimmed java impo
  • Foggy_driving数据集下载以及将其转换成VOC数据格式

    Foggy driving数据集官方下载地址 百度网盘下载链接 https pan baidu com s 1q4dhnlX doxlt13Mi uFZQ 提取码 2ap3 VOC格式的Foggy driving数据集百度网盘下载链接 ht
  • html基础题目

    1 在html中 样式表按照应用方式可以分为三种类型 其中不包括 d A 内嵌样式表 B 行内样式表 C 外部样式表文件 D 类样式表 2 在HTML中 可以使用 d 标记向网页中插入GIF动画文件 A
  • 从零开始实现自己的Kalimba——Cocos Creator新手教程系列(一)使用瓦片图Tiledmap设计游戏地图

    瓦片图Tiledmap可能是很多2d游戏开发者的偏爱 本节就Cocos Creator如何使用瓦片图进行详细的讲解 Tiled地图编辑器的下载安装不再赘述 下面介绍如何使用地图编辑器 创建新地图 地图方向选正常 其中45度和等角 交错 适合
  • uview2.0封装http请求实战以及常见请求传参实录

    1 前言 2 使用步骤 2 1 配置请求拦截器以及api集中管理配置 2 2 main js中进行引入请求拦截器 2 3 页面中引入请求方法并使用 1 前言 uview2 0是uniapp开发中使用频率相对来讲比较高的一款框架 今天从实战角
  • python爬虫十二:初步使用Scrapy框架爬取数据

    1 通过pipelines操作拿到的数据 要点一 爬虫文件必须通过关键字yield生成器才能与pipelines建立链接才可以操作 当运行爬虫文件之后执行的顺序如下图简介 如果重写模块或者内部方法可能会造成麻烦 往下翻阅可以看到open s