一文读懂python Scrapy爬虫框架
作者:曾亲桂林 发布时间:2021-01-31 10:08:31
Scrapy是什么?
先看官网上的说明,http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
Scrapy是一个非常好用的爬虫框架,它不仅提供了一些开箱即用的基础组件,还提供了强大的自定义功能。
# Scrapy 安装
Scrapy 官网:https://scrapy.org/
各位同学的电脑环境应该和小编的相差不远(如果是使用 win10 的话) 安装过程需要10分钟左右
安装命令:
pip install scrapy
由于 Scrapy 依赖了大量的第三方的包,所以在执行上面的命令后并不会马上就下载 Scrapy ,而是会先不断的下载第三方包,包括并不限于以下几种:
pyOpenSSL:Python 用于支持 SSL(Security Socket Layer)的包。
cryptography:Python 用于加密的库。
CFFI:Python 用于调用 C 的接口库。
zope.interface:为 Python 缺少接口而提供扩展的库。
lxml:一个处理 XML、HTML 文档的库,比 Python 内置的 xml 模块更好用。
cssselect:Python 用于处理 CSS 选择器的扩展包。
Twisted:为 Python 提供的基于事件驱动的网络引擎包。
……
如果安装不成功多试两次 或者 执行pip install --upgrade pip
后再执行 pip install scrapy
等待命令执行完成后,直接输入 scrapy 进行验证。
C:\Users\Administrator>scrapy
Scrapy 2.4.0 - no active project
Available commands:
bench Run quick benchmark test
...
版本号可能会有差别,不用太在意
如果能正常出现以上内容,说明我们已经安装成功了。
理论上 Scrapy 安装出现各种问题才算正常情况
三、Scrapy创建项目
Scrapy 提供了一个命令来创建项目 scrapy 命令,在命令行上运行:
scrapy startproject jianshu
我们创建一个项目jianshu用来爬取简书首页热门文章的所有信息。
jianshu/
scrapy.cfg
jianshu/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
spiders
文件夹下就是你要实现爬虫功能(具体如何爬取数据的代码),爬虫的核心。在spiders文件夹下自己创建一个spider,用于爬取简书首页热门文章。
scrapy.cfg
是项目的配置文件。
settings.py
用于设置请求的参数,使用代理,爬取数据后文件保存等。
items.py
自己预计需要爬取的内容
middlewares.py
自定义中间件的文件
pipelines.py
管道,保持数据
项目的目录就用网图来展示一下吧
image Scrapy爬取简书首页热门文章
cd到Jianshu项目中,生成一个爬虫:
scrapy genspider jianshublog www.jianshu.com
这种方式生成的是常规爬虫
1)新建jianshuSpider
import scrapy
class JianshublogSpider(scrapy.Spider):
name = 'jianshublog'
allowed_domains = ['www.jianshu.com']
start_urls = ['http://www.jianshu.com/']
def parse(self, response):
pass
可以看到,这个类里面有三个属性 name
、 allowed_domains
、 start_urls
和一个parse()
方法。
name
,它是每个项目唯一的名字,用来区分不同的 Spider。
allowed_domains
,它是允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤掉。start_urls
,它包含了 Spider 在启动时爬取的 url 列表,初始请求是由它来定义的。
parse
,它是 Spider 的一个方法。默认情况下,被调用时 start_urls 里面的链接构成的请求完成下载执行后,返回的响应就会作为唯一的参数传递给这个函数。该方法负责解析返回的响应、提取数据或者进一步生成要处理的请求。
到这里我们就清楚了,parse()
方法中的 response 是前面的 start_urls
中链接的爬取结果,所以在 parse() 方法中,我们可以直接对爬取的结果进行解析。
修改USER_AGENT
打开settings.py 添加 UA 头信息
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3493.3 Safari/537.36'
修改`parse`方法解析网页
我们打开简书首页 右键检查(ctrl+shift+I)发现所有的博客头条都放在类名.note-list
.content
的div 节点里面
修改jianshublog.py
代码如下
jianshublog.py
import scrapy
class JianshublogSpider(scrapy.Spider):
name = 'jianshublog'
allowed_domains = ['www.jianshu.com']
start_urls = ['http://www.jianshu.com/']
def parse(self, response):
blogs = response.css('.note-list .content')
# 获取博客列表
for blog in blogs: # 遍历博客列表
title = blog.css('.title::text').extract_first() # 提取标题
link = blog.css('.title::attr(href)').extract_first() # 提取链接
nickname = blog.css('.nickname::text').extract_first() # 提作者
print("标题:",title) # 打印标题
# print("链接:", link)
# print("作者:", nickname)
最后别忘了执行爬虫命令
scrapy crawl jianshublog
整个项目就完成啦
下一讲我们把文章数据爬取出来,存储在csv文件里面
来源:https://blog.csdn.net/bigzql/article/details/112130951


猜你喜欢
- 使用自带的Tkinter模块,简单的弹输入框示例,返回输入值from Tkinter import *import tkMessageBox
- 清除日志: DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT
- 这篇文章主要介绍了如何在mac环境中用python处理protobuf,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
-   跨平台的pywifi模块支持操作无线网卡,该模块易于使用,同时支持Windows、Linux等多个系
- 本文记录了mysql8.0.0 winx64.zip解压版安装教程,具体内容如下1、自己到mysql官网下载mysql-8.0.0-dmr-
- view()函数是在torch.Tensor.view()下的一个函数,可以有tensor调用,也可以有variable调用。其作用在于返回
- 为了方便各位朋友,本文收集了一些对Web开发人员非常有用的手册,记得推荐一下哦。HTML 速查手册HTML/XTML in one page
- python的多重继承的理解Python和C++一样,支持多继承。概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照
- 如下所示:# coding: utf-8import osimport psutilimport timedef write_pid():
- 1.安装背景最近想放弃windows编程环境,转到linux。原因就一个字:潮从格式化所有硬盘,到安装win10/ubuntu18.04双系
- 动画精灵和碰撞检测一、动画精灵动画精灵:四处移动的单个图像或图像部分称为动画精灵(sprite),pygame有一个特殊的模块帮助跟踪屏幕上
- 一、项目分析1、首先定义一个存放基础学生信息列表格式:list = [{学号:姓名,年龄:num,成绩:num },{……}]student
- 本篇博客参考Keqi Zhang的文章“A Progressive Morphological Filter for Removing No
- asp vbs Cache缓存类属性valid,是否可用,取值前判断属性name,cache名,新建对象后赋值方法add(值,到期时间),设
- 刚刚解决了这个问题,现在记录下来问题描述当使用lambda层加入自定义的函数后,训练没有bug,载入保存模型则显示Nonetype has
- 前言:处理字符串时经常要定制化去掉无用的空格,python 中要么用存在的常规方法,或者用正则处理1.去掉左边空格string = &quo
- 微信小程序终于可以支持npm导入第三方库了(https://developers.weixin.qq....),但是这种导入模式和使用模式有
- Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上。后来对Python渐渐熟悉了一点
- 前两天研究了一下textarea的直观行的换行规律,挺复杂啊:直观行怎样取不光要看cols大小,还要看网页编码方式。cols="3
- 类型: 1.普通游标 只有NEXT操作&nb