Python爬虫Scrapy(二)_入门案例

news2024/11/17 23:55:38

在这里插入图片描述

入门案例

学习目标

  • 创建一个Scrapy项目
  • 定义提取的结构化数据(Item)
  • 编写爬取网站的Spider并提取出结构化数据(Item)
  • 编写Item Pipelines来存储提取到的Item(即结构化数据)

一、新建项目(scrapy startproject)

  • 在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:
scrapy startproject cnblogSpider
  • 其中,cnblogSpider为项目名称,可以看到将会创建一个cnblogSpider文件夹,目录结构大致如下:

scrapy目录结构

scrapy.cfg:项目部署文件 cnblogSpider/: 该项目的python模块,之后可以在此加入代码 cnblogSpider/items.py: 项目中的item文件。 cnblogSpider/pipelines.py: 项目中的Pipelines文件。 cnblogSpider/settings.py: 项目的配置文件。 cnblogSpider/spiders/: 放置Spider代码的目录。

二、明确目标(mySpider/items.py)

我们打算抓取:“http://www.cnblogs.com/miqi1992/default.html?page=2” 网站里博客地址、标题、创建时间、文本。

  1. 打开cnblogSpider目录下的items.py
  2. item定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误。
  3. 可以通过创建一个scrapy.item类,并且定义类型为scrapy.Field的类属性来定义一个Item(可以理解成类似于ORM的映射关系)。
  4. 接下来,创建一个CnblogspiderItem类,和模型item模型(model)。 ```python import scrapy

class CnblogspiderItem(scrapy.Item): # define the fields for your item here like: url = scrapy.Field() time = scrapy.Field() title = scrapy.Field() content = scrapy.Field() ```

三、制作爬虫(spiders/cnblogsSpider.py)

爬虫功能主要分两步:

1. 爬数据

  • 在当前目录下输入命令,将在cnblogSpider/spiders目录下创建一个名为cnblog的爬虫,并制定爬取域的范围: scrapy genspider cnblog “cnblogs.com”
  • 打开cnblogSpider/spiders目录下的cnblog,默认增加了下列代码: ```python -- coding: utf-8 -- import scrapy

class CnblogSpider(scrapy.Spider): name = ‘cnblog’ allowed_domains = [‘cnblogs.com’] start_urls = [‘http://cnblogs.com/’]

def parse(self, response):
    pass

```

其实也可以由我们自行创建cnblog.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦

要建立一个Spider,你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性和一个方法。

  • name = "": 这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。

  • allow_domains=[]: 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。

  • start_urls=():爬取的URL元祖/列表。爬虫从这里开始爬取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。

  • parse(self, response)
    

    :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:

    1. 负责解析返回的网页数据(respose.body),提取结构化数据(生成item)
    2. 生成需要下一页的URL请求

将start_urls的值改为需要爬取的第一个url

start_urls=("http://www.cnblogs.com/miqi1992/default.html?page=2")

修改parse()方法

def parse(self, response):
    filename = "cnblog.html"
    with open(filename, 'w') as f:
        f.write(response.body)

然后运行一下看看,在cnblogSpider目录下运行:

scrapy crawl cnblog

是的,就是cnblog,看上面代码,它是CnblogSpider类的name属性,也就是scrapy genspider命令的唯一爬虫名。

运行之后,如果打印的日志出现[scrapy]INFO: Spider closed(finished),代表执行完成。之后当前文件夹中就出现了一个cnblog.html文件,里面就是我们刚刚要爬取的网页的全部源代码信息。

#注意,Python2.x默认编码环境是ASCII,当和取回的数据编码格式不一致时,可能会造成乱码;
#我们可以指定保存内容的编码格式,一般情况下,我们可以在代码最上方添加:
import os
reload(sys)
sys.setdefaultencoding('utf-8')
#这三行代码是Python2.x里面解决中文编码的万能钥匙,警告这么多年的吐槽后Python3学乖了,默认编码是Unicode了

2.爬数据

  • 爬取整个网页完毕,接下来就是取过程了,首先观察页面源码:

页面结构

<div class="day">
    <div class="dayTitle">...</div>
    <div class="postTitle">...</div>
    <div class="postCon">...</div>
</div>
  • XPath表达式如下:
    • 所有文章:.//*[@class=‘day’]
    • 文章发表时间:.//*[@class=‘dayTitle’]/a/text()
    • 文章标题内容:.//*[@class=‘postTitle’]/a/text()
    • 文章摘要内容:.//*[@class=‘postCon’]/div/text()
    • 文章链接:.//*[@class=‘postTitle’]/a/@href

是不是一目了然?直接上XPath开始提取数据吧。

  • 我们之前在cnblogSpider/items.py里定义了一个CnblogItem类。这里引入进来 from cnblogSpider.items import CnblogspiderItem
  • 然后将我们得到的数据封装到一个CnblogspiderItem对象中,可以保存每个博客的属性: ```python

form cnblogSpider.items import CnblogspiderItem

def parse(self, response): # print(response.body) # filename = “cnblog.html” # with open(filename, ‘w’) as f: # f.write(response.body)

    #存放博客的集合
    items = []

    for each in response.xpath(".//*[@class='day']"):
        item = CnblogspiderItem()
        url = each.xpath('.//*[@class="postTitle"]/a/@href').extract()[0]
        title = each.xpath('.//*[@class="postTitle"]/a/text()').extract()[0]
        time = each.xpath('.//*[@class="dayTitle"]/a/text()').extract()[0]
        content = each.xpath('.//*[@class="postCon"]/div/text()').extract()[0]

        item['url'] = url
        item['title'] = title
        item['time'] = time
        item['content'] = content 
        
        items.append(item)

    #直接返回最后数据
    return items

```

  • 我们暂时先不处理管道,后面会详细介绍。

保存数据

scrapy保存信息的最简单的方法主要有四种, -o 输出指定格式的文件,命令如下:

#json格式,默认为Unicode编码
scrapy crawl cnblog -o cnblog.json

#json lines格式,默认为Unicode编码
scrapy crawl cnblog -o cnblog.jsonl

#csv逗号表达式,可用excel打开
scrapy crawl cnblog -o cnblog.csv

#xml格式
scrapy crawl cnblog -o cnblog.xml

思考

如果将代码改成下面形式,结果完全一样

请思考yield在这里的作用:

form cnblogSpider.items import CnblogspiderItem

def parse(self, response):
        # print(response.body)
        # filename = "cnblog.html"
        # with open(filename, 'w') as f:
        #     f.write(response.body)

        #存放博客的集合
        # items = []

        for each in response.xpath(".//*[@class='day']"):
            item = CnblogspiderItem()
            url = each.xpath('.//*[@class="postTitle"]/a/@href').extract()[0]
            title = each.xpath('.//*[@class="postTitle"]/a/text()').extract()[0]
            time = each.xpath('.//*[@class="dayTitle"]/a/text()').extract()[0]
            content = each.xpath('.//*[@class="postCon"]/div/text()').extract()[0]

            item['url'] = url
            item['title'] = title
            item['time'] = time
            item['content'] = content 
            
            # items.append(item)
            #将获取到的数据交给pipelines
            yield item

        #直接返回最后数据,不经过pipelines
        #return items

更多Python的学习资料可以扫描下方二维码无偿领取!!!

1)Python所有方向的学习路线(新版)

总结的Python爬虫和数据分析等各个方向应该学习的技术栈。

在这里插入图片描述

比如说爬虫这一块,很多人以为学了xpath和PyQuery等几个解析库之后就精通的python爬虫,其实路还有很长,比如说移动端爬虫和JS逆向等等。

img

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然达不到大佬的程度,但是精通python是没有问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

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

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

相关文章

计算机毕设 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

文章目录 0 前言1.前言2.实现效果3.相关技术原理3.1卷积神经网络3.1YOLOV5简介3.2 YOLOv5s 模型算法流程和原理4.数据集处理3.1 数据标注简介3.2 数据保存 5.模型训练 6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题…

[Round#14 Illuminate with your bril]

周末NSS的PWN专题&#xff0c;只作了3个&#xff0c;结束后跟NSS的师傅聊&#xff0c;对方确认了第4题的作法&#xff0c;重作成功。第5题看师傅的WP复现成功。 love 主函数给了个printf&#xff0c;这里可以得到所有地址&#xff0c;并且要求把v4,v5改相等 int __cdecl mai…

Linux 版本的 Abyss Locker 勒索软件针对 VMware ESXi 服务器

Abyss Locker 是最新开发的 Linux 加密器&#xff0c;旨在针对 VMware 的 ESXi 虚拟机平台对企业进行攻击。 随着企业从单个服务器转向虚拟机以实现更好的资源管理、性能和灾难恢复&#xff0c;勒索软件团伙创建了专注于针对该平台的加密器。 随着 VMware ESXi 成为最流行的虚…

UE5 摄像机与NPC重叠阻挡导致视角闪现的解决方法

文章目录 前言问题背景问题剖析摄像机碰撞分析解决方法总结前言 本文基于虚幻5.2.1版本,对摄像机与NPC重叠阻挡导致视角闪现提供一个解决方案,并深入讲解摄像机碰撞原理,提升大家的思维与解决问题的能力。 问题背景 当我们被NPC攻击或者NPC介于摄像机与玩家之间导致摄像机…

小研究 - JVM GC 对 IMS HSS 延迟分析(二)

用户归属服务器&#xff08;IMS HSS&#xff09;是下一代通信网&#xff08;NGN&#xff09;核心网络 IP 多媒体子系统&#xff08;IMS&#xff09;中的主要用户数据库。IMS HSS 中存储用户的配置文件&#xff0c;可执行用户的身份验证和授权&#xff0c;并提供对呼叫控制服务器…

微服务入门---Docker

微服务入门---Docker 1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker 2.…

Flutter环境搭建踩坑集锦

Flutter 背景准备工作先检查一下自己的电脑&#xff0c;看一下是不是满足配置要求下载安装配置环境下载安装JDK下载安装Android studio下载Flutterflutter doctor故障Android license status unknownNetwork resources 故障 后记 背景 发现一个不错的框架Flutter&#xff0c;听…

web题型

0X01 命令执行 漏洞原理 没有对用户输入的内容进行一定过滤直接传给shell_exec、system一类函数执行 看一个具体例子 cmd1|cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1;cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1&cmd2:无论cmd1是否执行成…

【C++继承】

目录 一、继承的概念及定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承方式与访问限定符的组合 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承八、虚拟继承的原理 一、继承…

(AcWing)满足条件的01序列

给定 n 个 0 和 n 个 1&#xff0c;它们将按照某种顺序排成长度为 2n 的序列&#xff0c;求它们能排列成的所有序列中&#xff0c;能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。 输出的答案对 10^97 取模。 输入格式 共一行&#xff0c;包含整数 n。 …

Kotlin基础(十):函数进阶

前言 本文主要讲解kotlin函数&#xff0c;之前系列文章中提到过函数&#xff0c;本文是kotlin函数的进阶内容。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 函数基本用法 Kotlin 是一种现代的静态类型编程语言&#xff0c;它在函数的定义和使用上有一些特点…

软考A计划-系统集成项目管理工程师-项目干系人管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

简单易用的批量重命名工具,C++语言编写

它具备出色的文件重命名功能,能够让用户轻松对多个文件进行批量重命名操作。不论是添加前缀、后缀,还是替换文件名称中的特定字符,都能轻松完成。此外,该软件体积小巧、操作简单便捷,使用起来的效果出奇好。 MiniRenamer特色功能: 正则命名:支持正则命名规则,并可自定义…

【机器学习】Classification using Logistic Regression

Classification using Logistic Regression 1. 分类问题2. 线性回归方法3. 逻辑函数&#xff08;sigmod&#xff09;4.逻辑回归5. 决策边界5.1 数据集5.2 数据绘图5.3 逻辑回归与决策边界的刷新5.4 绘制决策边界 导入所需的库 import numpy as np %matplotlib widget import m…

【Linux】进程的认识

查看进程指令proc/ps/top 注意哦, 我们经常使用的指令, 像ls, touch…这些指令在启动之后本质上也是进程 proc 是内存文件系统, 存放着当前系统的实时进程信息. 每一个进程在系统中, 都会存在一个唯一的标识符(pid -> process id), 就如同学生在学校里有一个专门的学号一样…

Mac笔记本安装maven

Mac笔记本安装maven 一、通过brew安装maven 如果你的mac笔记本安装了homebrew可以使用如下命令安装 brew install maven安装完成后可以使用命令brew list maven来查看maven的安装位置 $ brew list maven /usr/local/Cellar/maven/3.6.3_1/bin/mvn /usr/local/Cellar/mave…

从零开始学Docker(三):DockerFile镜像定制

宿主机环境&#xff1a;RockyLinux 9 前言&#xff0c;定制docker镜像的方式有两种&#xff1a; 手动修改容器内容&#xff0c;然后docker commit提交容器为新的镜像通过在dockerfile中定义一系列的命令和参数构成的脚本&#xff0c;然后这些命令应用于基础镜像&#xff0c;依…

leetcode 面试题 0106.字符串压缩

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;面试题 0106.字符串压缩 思路&#xff1a; 开辟一个新的空间&#xff08;空间要大一点&#xff0c;因为可能压缩后的字符串比原字符串大&#xff09;&#xff0c;然后遍历原字符串统计当前字符的个数&#xff0c;再写入到…

使用vmd渲染并保存指定分辨率的图片

准备TCL脚本文件 # 设置渲染分辨率为1920x1080,600dpi render TachyonInternal out.tga width 1920 height 1080 dpi 600# 启用抗锯齿选项 display antialias on运行TCL 输入&#xff1a; source render.tcl使用Photoshop打开输出的out.tga文件并保存常用图片格式

【蓝桥杯备考资料】如何进入国赛?

目录 写在前面注意事项数组、字符串处理BigInteger日期问题DFS 2013年真题Java B组世纪末的星期马虎的算式振兴中华黄金连分数有理数类&#xff08;填空题&#xff09;三部排序&#xff08;填空题&#xff09;错误票据幸运数字带分数连号区间数 2014年真题蓝桥杯Java B组03猜字…