python scrapy框架学习记录

scrapy框架知识点整理

最近闲来无事,之前都是用requests自己写爬虫脚本,突发奇想,想尝试一下使用框架会怎么样。查看了下介绍,尝试着自学了一下该框架,不是很精通,现在将学习该框架的过程中总结的一些东西记录下来,一方面是方便自己以后查看,另一方面也是希望大家批评指正,补充完善。

XXX代表的是你为这个项目起的名字。

scrapy startproject XXX

XXX代表你为这个爬虫起的名字。 XXX.com代表你需要爬取的域名。

scrapy genspider XXX XXX.com

这里的爬虫名就是上一步你自己起的名字

scrapy crawl 爬虫名

scrapy框架的数据解析是通过selector进行的,这是一个封装好的类。使用方法如下:

book_name = response.css('a')
book_name = response.xpath('//a/text()')

这个时候的book_name是一个selector对象

[<selector xpath="./h3/a/@title" data="It's Only the Himalayas">]
</selector>

我们需要从这个对象中把data中我们需要的数据取出来,这时候就用到了以下方法:

  • extract() 可以返回一个含有所有的元素结果的 list 列表 [ ],如果未获取到数据,则这个列表为空
  • getall() 这个和extract()的作用差不多
  • extract_first() 顾名思义,这个是获取extract()返回的列表的第一个元素
  • get() 这个和extract_first()的作用差不多
  • re(‘正则表达式’) 这个是返回一个与正则表达式相匹配的 list 列表。selectorList支持正则表达式
  • re_first() 返回第一个元素

这个文件的作用是处理数据。比如:数据清洗,数据验证,过滤重复的数据,将数据写入数据库(或者特定的文件类型(Excel))

Item Pipelines 是可选项目,默认是关闭的。要使用这个功能需要在setting.py文件中开启相关的开关(即将注释的代码取消注释)


ITEM_PIPELINES = {
   'bookdown.pipelines.PriceConverterPipline': 300,
   'bookdown.pipelines.DuplicatesPipeline': 310,
}

字典中的key是pipelines.py 中的类名,注意不要写错了,val是数值,代表执行的优先级,数值越小,优先级越高(即先执行)。

"""
去重的事例
"""

class DuplicatesPipeline:
    def __init__(self):
        self.book_set = set()

    def process_item(self, item, spider):
        name = item["name"]
        if name in self.book_set:
            raise scrapy.exceptions.DropItem("重复的书籍为:{}".format(item))
        self.book_set.add(name)

        return item

"""
数值转换的事例
"""
class PriceConverterPipline:
    exchange_rate = 8.5309

    def process_item(self, item, spider):
        price = float(item["price"]) * self.exchange_rate
        item["price"] = "¥{:.2f}".format(price)
        return item

这个类的作用是用来提取链接的,也就是url地址(类比,不准确)。

from scrapy.linkextractors import LinkExtractor
"""
用法的示例
"""

le = LinkExtractor(restrict_xpaths='//ul[@class="pager"]/li[@class="next"]/a')
le = LinkExtractor(restrict_css='ul.pager li.next')
"""
上面这两个写法一个是xpath,一个是css,获取的内容是一样的
"""
links = le.extract_links(response)
"""
这是links获取的数据样式,它是一个list集合,每一个Link()都是集合中的一个元素。
可以用  linkes[0].url  获得links第一个Link的url
[Link(url='http://books.toscrape.com/catalogue/page-2.html', text='next', fragment='',
nofollow=False)]
"""
pattern = '/info/.+\.html$'
pattern = ['/info/.+\.html$', '/waring/.+\.html$']
le = LinkExtractor(allow=pattern)
scrapy crawl books -o books.csv
scrapy crawl books -o books.data -t csv
"""
%(name)s  这个代表爬虫的名字
%(time)s  这个代表爬虫运行的时间
"""
FEED_URI = 'export/%(name)s/%(time)s.csv'
FEED_FORMAT = "csv"
FEED_EXPORT_ENCODING = "gbk"
FEED_EXPORT_FIELDS = ["name", "modle", "age"]
FEED_EXPORTERS = { "excel" : "my_project.my_exporters.ExcelItemExporter" }

注意,scrapy2.5版本对 FEED 做出了修改,废弃了 FEED_URI 改用 FEEDS。
FEEDS 不仅用来设置路径,格式,编码,输出字段,等都可以在FEEDS中配置。示例代码如下:


FEEDS = {
    "export/%(name)s/%(time)s.xls": {
        "format": "excel",
        "encoding": "utf8",
        "fields": ["UPC", "name", "price", "availability", "star_number", "reviews_num", "image_urls", "images"]
    },
}
ITEM_PIPELINES = {
'scrapy.pipelines.files.FilesPipeline' : 1,
'scrapy.pipelines.images.ImagesPipeline':2,
}
"""
这个位置按自己的实际情况自己配置哈
"""
FILES_STORE = "/home/liushuo/Download/scrapy"
IMAGES_STORE = "/home/liushuo/Download/scrapy"
class DownloadBookSpider(scrapy.Spider):
        ...

        def parse(response):
            item = {}

            item['file_urls'] = []
            for url in response.xpath('//a/@href').extract():
                download_url = response.urljoin(url)

                item['file_urls'].append(download_url)
            yield item

class DownloadBookSpider(scrapy.Spider):
        ...

        def parse(response):
            item = {}

            item['image_urls'] = []
            for url in response.xpath('//a/@href').extract():
                download_url = response.urljoin(url)

                item['image_urls'].append(download_url)
            yield item

这个设定如果不设置,那么文件的命名规则为: SHA1 hash(哈希值)+.jpg
例如:”3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg”

import os
from urllib.parse import urlparse

from scrapy.pipelines.files import FilesPipeline

class MyFilesPipeline(FilesPipeline):

    def file_path(self, request, response=None, info=None, *, item=None):
        return 'files/' + os.path.basename(urlparse(request.url).path)

"""
以下是ImagesPipeline的
"""
import os
from urllib.parse import urlparse

from scrapy.pipelines.images import ImagesPipeline

class MyImagesPipeline(ImagesPipeline):

    def file_path(self, request, response=None, info=None, *, item=None):
        path = urlparse(request.url).path

        return 'files/' + os.path.basename(path)

ITEM_PIPELINES = {

'myproject.pipelines.MyFilesPipeline': 300,
'myproject.pipelines.MyImagesPipeline': 300
}

ImagesPipeline 依赖 pillow库。依靠这个库来实现JPEG/RGB格式图片增加缩略图或者将尺寸过小的图片过滤。

开启该功能,只需在配置文件settings.py中设置IMAGES_THUMBS,它是一个字典,每一项的值是缩略图的尺寸,开启该功能后,会下载3张图片,分别为原图,”small”图,”big”图。
代码如下:

IMAGES_THUMBS = {
        'small': (50, 50),
        'big': (270, 270),
     }

开启该功能,只需在配置文件settings.py中设置IMAGES_MIN_WIDTH和IMAGES_MIN_HEIGHT,它们分别指定图片最小的宽和高。开启该功能后,只要宽和高有一项不符合设定,图片就会被舍弃。如100×210的图片,因为105不符合设定,该图片就会被舍弃。
代码如下:

IMAGES_MIN_WIDTH = 110
IMAGES_MIN_HEIGHT = 110

Original: https://blog.csdn.net/marker_sun/article/details/122882708
Author: marker_sun
Title: python scrapy框架学习记录

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/789497/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 矩阵点乘与叉乘的操作,python实现

    1. 与线性代数中的矩阵乘法定义相同:np.dot(),或@ np.dot(A, B):对于二维矩阵,计算真正意义上的矩阵乘积,即A的i行元素与B的j列元素相乘的积的和作为新矩阵的…

    Python 2023年8月24日
    057
  • pandas读写文件

    Pandas读取的数据为DataFrame类型,而DataFrame可以写入到各种格式的文件中,其中包括json、html、文本文件、数据库、Excel文件等等。(注:DataFr…

    Python 2023年8月18日
    054
  • python小游戏——兔鼠大战

    python小游戏——兔鼠大战 一.准备环境:更改设置pip 国内镜像 在使用pycharm来制作小游戏写代码的时候需要编译环境,使用pip镜像源,由于pip管理工具安装库文件时,…

    Python 2023年9月21日
    024
  • Python推导式创建数列的方法

    列表推导式生成列表对象,语法如下: ”’ [表达式 for item in 可迭代对象] 或者 [表达式 for item in 可迭代对象 if 条件判断] ”’ l1 = …

    Python 2023年10月31日
    041
  • python游戏开发keydown_pygame.KEYDOWN移动对象

    作者,持牌照消费金融模型经理,发明国家算法专利,国内大型医药数据中心担任过数据库负责人。和中科院,清华大学,百度,腾讯,爱奇艺等平台保持长期项目合作。擅长python 机器学习,应…

    Python 2023年9月21日
    036
  • scipy的安装教程

    导读 上篇文章Python的数学计算库scipy介绍中已经详细介绍过了 scipy的用途,这篇文章主要来介绍如何安装scipy,本篇文章安装Python包的方法适用于其他的包 安装…

    Python 2023年8月1日
    061
  • python 命令行框架_python的pytest框架之命令行参数详解(上)

    pytest是一款强大的python自动化测试工具,可以胜任各种类型或者级别的软件测试工作。pytest提供了丰富的功能,包括assert重写,第三方插件,以及其他测试工具无法比拟…

    Python 2023年9月14日
    048
  • 仿写Dubbo-Java代理

    概念 代理是一种设计模式。使用代理对象替换真实对象,实现不修改真实对象的前提下对其进行额外操作,对其进行扩展。spring中的aop就是使用代理实现的。 静态代理 静态代理中的 真…

    Python 2023年11月6日
    038
  • 最新CUDA环境配置教程(ubuntu 20.04 + cuda 11.7 + cuDNN 8.4)

    ubuntu 20.04 CUDA 11.7 cuDNN 8.4 环境配置教程 ubuntu 20.04 CUDA 11.7 cuDNN 8.4 环境配置教程 1.查看是否有合适的…

    Python 2023年9月15日
    0114
  • 基于高通平台的dToF Sensor开机点亮教程

    作为一个优秀的驱动工程师,迅速点亮目前市面上的Soc平台是非常必须的。如果你花费了很多时间无法Set up起平台,那你这驱动开发可能还有待提升,特别如今这市场,想要更高更强,驱动开…

    Python 2023年11月4日
    032
  • 2022年总结——实习

    lastday!感觉有很多想总结和分享的,但一落实到键盘上似乎就变得无从下手了(-__-)。但还是想发表点什么,哪怕是对看到这篇博客的你们有那么一点点帮助也是好的。 notice:…

    Python 2023年10月11日
    037
  • Pytest框架:测试用例setup和teardown

    背景:假如我们进入多个模块前(每个模块有一个用例),都要打开浏览器登录,执行完毕后,需要退出再关闭浏览器,即每次运行前都要执行登录打开、退出关闭两个大量重复的操作;这些我们都可以用…

    Python 2023年9月10日
    039
  • python+pytest接口自动化之session会话保持

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年9月9日
    036
  • centos+git+Jenkins+pytest+allure实现自动化集成测试后发送测试报告邮件(一):git仓库搭建

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、git是什么? 二、git服务端安装配置(远程仓库) * 2.1.git服务端安装 2.2.为…

    Python 2023年9月14日
    033
  • 【笔记】PyTorch快速入门:基础部分合集

    Tensors Tensors贯穿PyTorch始终 和多维数组很相似,一个特点是可以硬件加速 有很多方式 直接给值 data = [[1,2],[3,4]] x_data = t…

    Python 2023年10月28日
    023
  • 项目部署 — Gunicorn + supervisor 管理Python项目

    Article structure: Gunicorn ‘Green Unicorn’(发音 jee-unicorn | green unicorn | g…

    Python 2023年8月15日
    054
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球