scrapy的入门使用

news2025/2/27 17:05:04

目录

一、 安装scrapy

1.windonws/Mac安装命令:

2. 安装依赖包:pip install pypiwin32

二、 scrapy项目开发流程

1.创建项目:   

2.生成一个爬虫:

3.提取数据:

4.保存数据:

三、 创建项目

四、创建爬虫

五、完善爬虫

5.2 定位元素以及提取数据、属性值的方法

六、保存数据

6.1 在pipelines.py文件中定义对数据的操作

6.2 在settings.py配置启用管道

七、 运行scrapy

7.1 可爬虫项目中执行命令

八、Scrapy Shell的使用

打开Scrapy Shell

九、 翻页请求的思路

十、如何构造Request对象,并发送请求

10.1 实现方法

10.2 代码实现


一、 安装scrapy


1.windonws/Mac安装命令:

​ pip/pip3 install scrapy (换源安装命令:pip install scrapy -i Simple Index --trusted-host pypi.douban.comn )
​

2. 安装依赖包:pip install pypiwin32

    如果不安装,以后的项目会报错
    window系统需要安装,Linux,Mac不需要

二、 scrapy项目开发流程

1.创建项目:   

 scrapy startproject mySpider

2.生成一个爬虫:

scrapy genspider lianjia lianjia.com

3.提取数据:

         根据网站结构在spider中实现数据采集相关内容

4.保存数据:

         使用pipeline进行数据后续处理和保存

三、 创建项目

通过命令将scrapy项目的的文件生成出来,后续步骤都是在项目文件中进行相关操作,下面以抓取链家来学习scrapy的入门使用

创建scrapy项目的命令:

scrapy startproject <项目名字>


示例:
    

scrapy startproject myspider

生成的目录和文件结果如下:

四、创建爬虫

通过命令创建出爬虫文件,爬虫文件为主要的代码文件,通常一个网站的爬取动作都会在爬虫文件中进行编写。

命令:
    在项目路径下执行:
    

scrapy genspider <爬虫名字> <允许爬取的域名>

爬虫名字: 作为爬虫运行时的参数
允许爬取的域名: 为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的url,如果爬取的url与允许的域不通则被过滤掉。

示例:

cd myspider # 这一步是进入当前项目路径

scrapy genspider lianjia lianjia.com # 再创建爬虫文件

以上操作完成后再打开pycharm就可以清楚查看到项目层级结构

现对如下几个py文件做说明:

1.scrapy.cfg 详细项目配置文件, 不需要做改动

2.items.py 定义数据存储模型

3.middlewares.py 用于编写中间件(下载中间件+爬虫中间件) -- 无特殊需求,一般不需要编写

4.lianjia.py (爬虫文件,文件名称自己定义) [后面再来完善该爬虫模块]

5.pipelines.py 管道 -- 主要用于编写数据处理步骤 (数据的清洗+保存)

6.settings.py 详细的配置信息(设置文件UA 并启动管道) 

五、完善爬虫

在上一步生成出来的爬虫文件中编写指定网站的数据采集操作,实现数据提取

5.1 在/myspider/myspider/spiders/itcast.py中修改内容如下:

import scrapy
from mySpider.items import MyspiderItem

class LianjiaSpider(scrapy.Spider):
    # 爬虫名字
    name = 'lianjia'
    # 限定爬取的域名范围
    allowed_domains = ['cs.lianjia.com']
    # 起始请求的URL
    start_urls = ['https://cs.lianjia.com/zufang/']

    # 该方法会接受下载中间件传过来的response,并对其进行解析
    def parse(self, response):
        # print("响应对象:",response)  # response是一个响应对象
        # html_data = response.body  # 获取网页源码
        # print("源码信息:", html_data)
        # # 将获取回来的网页源码保存为本地html文件,方便做分析
        # with open('lj.html','wb')as f:
        #     f.write(html_data)
        # 正式解析想要的数据
        # 会返回一个为列表的Selector选择器对象
        # 将列表遍历成字符串再通过.extract()取选择器里的所有值,.extract_first()取出选择器里的第一个值
        name = response.xpath(
            '//div[@class="content__list--item--main"]//p[@class="content__list--item--title"]/a/text()').extract()
        price = response.xpath('//div[@class="content__list--item--main"]//em/text()').extract()
        link = response.xpath('//div[@class="content__list--item--main"]//a[@class="twoline"]/@href').extract()
        for names, prices, links in zip(name, price, link):
            # 创建一个数据字典
            # item = {}
            # 调用items模板类
            item = MyspiderItem()  #实例化之后可以直接使用 目前是一个空字典
            # 给实例之后的空字典组建数据 要注意得与items文件中定义的变量一致
            item["name"] = names.strip()
            item["price"] = prices
            item["link"] = "https://cs.lianjia.com/" + links
            # print(names.strip())
            # print(prices)
            # print("https://cs.lianjia.com/"+links)
            # print('=='*10)
            # print(item)
            
            # 将组建好的dict形式数据通过yield返回给引擎 再交给管道文件Pipeline
            yield item

注意:

  • scrapy.Spider爬虫类中必须有名为parse的解析
  • 如果网站结构层次比较复杂,也可以自定义其他解析函数
  • 在解析函数中提取的url地址如果要发送请求,则必须属于allowed_domains范围内,但是start_urls中的url地址不受这个限制,我们会在后续的课程中学习如何在解析函数中构造发送请求
  • 启动爬虫的时候注意启动的位置,是在项目路径下启动
  • parse()函数中使用yield返回数据,注意:解析函数中的yield能够传递的对象只能是:BaseItem, Request, dict, None

5.2 定位元素以及提取数据、属性值的方法

解析并获取scrapy爬虫中的数据: 利用xpath规则字符串进行定位和提取

  1. response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法
  2. 额外方法extract():返回一个包含有字符串的列表
  3. 额外方法extract_first():返回列表中的第一个字符串,列表为空没有返回None

六、保存数据

利用管道pipeline来处理(保存)数据

6.1 在pipelines.py文件中定义对数据的操作

  1. 定义一个管道类
  2. 重写管道类的process_item方法
  3. process_item方法处理完item之后必须返回给引擎

# 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
import json

from itemadapter import ItemAdapter

class MyspiderPipeline:
    def __init__(self):
        self.file = open('lianjia.json','w')

    # 爬虫文件中提取数据的方法每yield一次item,就会运行一次
    # 该方法为固定名称函数
    def process_item(self, item, spider):
        # 参数item默认是一个 <class 'mySpider.items.MyspiderItem'>类信息,需要处理成字典
        dict_data = dict(item)
        print(type(item), type(dict_data))
        # 将返回的字典数据转为JSON数据
        json_data = json.dumps(dict_data,ensure_ascii=False)+',\n'
        # 写入JSON数据
        self.file.write(json_data)
        # 参数item:是爬虫文件中yield的返回的数据对象(引擎会把这个交给管道中的这个item参数)
        print("建模之后的返回值:",item,)
        # 默认使用完管道之后将数据又返回给引擎
        return item

    def __del__(self):
        self.file.close()

6.2 在settings.py配置启用管道

#   设置目录文件               该值的大小决定管道执行的顺序,值越小优先级越高(该值最好 不要大于1000)  
ITEM_PIPELINES = {
   'mySpider.pipelines.MyspiderPipeline': 300,
}

以上配置项中键为使用的管道类,管道类使用.进行分割,第一个为项目目录,第二个为文件,第三个为定义的管道类。
配置项中值为管道的使用顺序,设置的数值约小越优先执行,该值一般设置为1000以内。

七、 运行scrapy

命令:在项目目录下执行scrapy crawl <爬虫名字>

示例:scrapy crawl 爬虫名字 --nolog 忽略日志信息

7.1 可爬虫项目中执行命令

        每次我们写完代码进行测试的时候,都要去安装目录执行,所以为了方便,我们要写一个再爬虫项目根目录中创建.py结尾的文件,执行以下指令:

from scrapy import cmdline
cmdline.execute(['scrapy','crawl','lianjia'])

八、Scrapy Shell的使用

我们想要爬虫中使用xpath,BS4,正则,css选择器等来提取想要的数据时,由于Scrapy是一个重量级框架,每次运行起来都要等待一段时间,因此要去验证我们书写的规则是否正确,是一个比较麻烦的事情,因此Scrapy提供了一个shell,用起来方便测试规则

打开Scrapy Shell

        打开cmd终端,进入到Scrapy项目所在目录,进入到Scrapy框架所在的环境中,输入命令:

scrapy shell url ,就会进入到scrapy的shell环境中,在这个环境中,你可以跟在爬虫的parse方法中一样使用了

九、 翻页请求的思路

对于要提取如下图中所有页面上的数据该怎么办?回顾requests模块是如何实现翻页请求的:

  1. 找到下一页的URL地址
  2. 调用requests.get(url)

scrapy实现翻页的思路:(scrapy并无单独的url这个概念,scrapy中都是需要将url打包成一个请求对象)

  1. 找到下一页的url地址
  2. 把url地址构造成请求对象,传递给引擎

十、如何构造Request对象,并发送请求

10.1 实现方法

  1. 确定url地址
  2. 构造请求,scrapy.Request(url,callback)
    • callback:指定响应体解析的函数名称,表示该请求返回的响应使用哪一个函数进行解析(callback不赋值的话默认是给parse方法解析)
  3. 把请求交给引擎:yield scrapy.Request(url,callback)

思路分析:

  1. 获取首页的响应数据(因为里面有我们想要的翻页链接)
  2. 寻找下一页的地址,进行翻页,获取数据

10.2 代码实现

在爬虫文件的parse方法中:

...
        # 开始构造翻页
        # 1,提取下一页url
        all_url = response.xpath('//ul[@style="display:hidden"]//li/a/@href').extract()
        print(all_url)
        for part_url in all_url:
            # 2,判断条件
            if '/zufang/' in part_url:
                next_url = response.urljoin(part_url)
                print("下一页参数信息:", part_url)
                print("下一页链接:", next_url)
                # 构建请求对象 并且返回给引擎
                yield scrapy.Request(url=next_url,callback=self.parse)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

序列化与反序列化笔记

序列化与反序列化 为什么会有序列化与反序列化的需求呢&#xff1f; 序列化是把对象转换成有序字节流&#xff0c;通常都是一段可阅读的字符串&#xff0c;以便在网络上传输或者保存在本地文件中。同样&#xff0c;如果我们想直接使用某对象时&#xff0c;就可能通过反序列化…

23-Vue之事件修饰符

事件修饰符前言阻止默认行为阻止冒泡事件前言 本篇来学习两个常用的事件修饰符 阻止默认行为 .prevent : 阻止默认行为 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" cont…

基于JSP的网上书城平台【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86469277 主要使用技术 ServletJDBCJSPC3P0JqueryMysql 功能介绍 1). 用户模块功能有&#xff1a; 用户注册: 表单页面是jQuery做校验(包含了ajax异步请求) 表单页面使用一次性图形验证码…

分布式事务Seata

目录 一、分布式事务的认识 事务的ACID原则 CAP定理 BASE理论 二、Seata简介、安装和部署 1.初识Seata 2.下载Seata&#xff08;1.4.2版本&#xff0c;其他版本可能与本章教程冲突&#xff09; 3.修改配置文件 4.在nacos添加配置 5.创建配置文件中的数据库表 6.启动TC…

二、微服务拆分案例

文章目录一、服务拆分&#xff08;order-service、user-service&#xff09;1.创建数据库2.创建order-service和user-service模块&#xff0c;引入依赖3、order-service各层代码4、user-service各层代码一、服务拆分&#xff08;order-service、user-service&#xff09; 1.创建…

猴子也能学会的jQuery第十二期——jQuery遍历

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

【金融项目】尚融宝项目(十五)

29、提现和还款 29.1、提现 29.1.1、需求 放款成功后&#xff0c;借款人可以申请提现。 参考《汇付宝商户账户技术文档》3.15用户申请提现 29.1.2、前端整合 pages/user/withdraw.vue <script> export default {data() {return {fetchAmt: 0,}},methods: {commitWit…

基于SSM的宿舍财产管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86469100 主要使用技术 SpringSpringMVCMybatisEasyUIJqueryMysql 功能介绍 本系统的用户可以分为三种&#xff1a;管理员、教师、学生。 系统设置 菜单管理&#xff1a;菜单节点的增删改查…

中国传统美食网页HTML代码 学生网页课程设计期末作业下载 美食大学生网页设计制作成品下载 DW餐饮美食网页作业代码下载

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【学习笔记41】DOM操作的练习

一、回到顶部 我们在浏览页面的时候&#xff0c;当我们浏览到一个页面的底部的时&#xff0c;一般都会有一个返回底部 &#xff08;一&#xff09;案例分析 1、当页面滚动的距离大于300的时候&#xff0c;让herder和btn展示 header的top设置为0的时候就能看到btn的display设置…

web网页设计期末课程大作业——海贼王大学生HTML网页制作 HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

HTML常用标记(超详解)

目录 一、文本标记 二、列表标记 三、分割线标记 四、超链接标记 五、图片标记 六、多媒体标记 七、标记类型 八、meta标记 一、文本标记 1.标题标记 语法格式&#xff1a; <hn align"对齐方式">标题文本</hn> html中提供了六级标题&#xff…

产业经济专题:产业结构高级化、合理化指数、工业化率、机构水平化及产业升级度

一、产业关联度的密度指数 1、数据来源&#xff1a;见参考文献 2、时间跨度&#xff1a;无 3、区域范围&#xff1a;无 4、指标说明&#xff1a; 附件中包括命令和案例数据 部分数据如下&#xff1a; 计算参考文献&#xff1a; Xiao J, Boschma R, Andersson M. Industr…

分布式NoSQL数据库HBase实践与原理剖析(一)

title: HBase系列 第一章 HBase基础理论 1.1 HBase简介 Apache HBase™ is the Hadoop database, a distributed, scalable, big data store. Apache HBase™ 是Hadoop数据库&#xff0c;是一种分布式、可扩展的大数据存储。HBase 是 BigTable 的开源 java 版本。 建立在 HDF…

SecXOps 核心技术能力划分

核心能力 为了加快安全分析能力更全面、更深入的自动化 &#xff0c;SecXOps 的目标在于创建一个集成的用于 Security 的 XOps 实践&#xff0c;提升安全分析的场景覆盖率和运营效率。SecXOps 技术并不 015 SecXOps 技术体系 是 Ops 技术在安全领域的简单加和&#xff0c;SecXO…

浏览器输入www.baidu.com的请求过程是怎么样的? 响应的过程是怎样的呢?

假设我们电脑的相关配置为&#xff1a; ip地址&#xff1a;192.168.31.37 子网掩码&#xff1a;255.255.255.0 网关地址&#xff1a;192.168.31.1 DNS地址&#xff1a;8.8.8.8 1. DNS 解析 我们打开一个浏览器&#xff0c;请求ww.baidu.com地址&#xff0c;这个时候找DNS 服务…

梅西进球了,用Python预测世界杯冠军是 ... 网友:痛,太痛了

今天凌晨&#xff0c;夺冠热门阿根廷终于赢球了&#xff0c;梅西也打进了自己本届世界杯的第一粒进球&#xff01;你熬夜看这场比赛了吗&#xff1f; 小编也用Python预测了一下本届世界杯的冠军归属&#xff0c;结果却不是阿根廷&#xff0c;来一起看看吧~ 预测结果 根据Pyt…

《QEMU/KVM源码分析与应用》读书笔记4 —— 第2章 QEMU基本组件(1)

2.1 QEMU事件循环机制 2.1.1 glibc事件循环机制 知识提炼&#xff1a; glib事件循环机制 QEMU程序的运行基于各类文件fd事件&#xff0c;QEMU在运行过程中会将自己感兴趣的文件fd添加到其监听列表上&#xff0c;并定义相应的处理函数。在QEMU主线程中&#xff0c;有一个循环…

JS--数组类型 Array 1

数组是一种特殊的对象&#xff0c;数组是按照顺序排列的一组值&#xff08;元素&#xff09;&#xff0c;每个位置都有一个编号&#xff0c;编号从0开始&#xff0c;编号也叫索引或者下标。数组可以存储任意数据类型。 一 、 创建数组方法 1.用[ ] <script>// 数字的…

【机器学习项目实战10例】(二):利用LightGBM实现天气变化的时间序列预测

🌠 『精品学习专栏导航帖』 🐳最适合入门的100个深度学习实战项目🐳🐙【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码🐙🐶【机器学习入门项目10例目录】项目详解 + 数据集 + 完整源码🐶🦜【机器学习项目实战10例目录】项目详解 + 数据集 +