通过上一节《Python Scrapy爬虫框架详解》的学习,您已经对 Scrapy 框架有了一个初步的认识,比如它的组件构成,配置文件,以及工作流程。本节将通过一个的简单爬虫项目对 Scrapy 框架做进一步介绍。

首先看一个简单的示例,比如把 python教程入门学习公众号首页的“title”抓取下来,如下所示:

<html lang="zh-cn">
<head>
<meta charset="gb2312" />
<meta name="baidu-site-verification" content="6B13HRSfYA" />
<link rel="shortcut icon" href="/cpp/favicon.ico" />
<title>python教程入门学习:python教程入门学习公众号(入门教程、编程软件)</title>
....
</head>

创建项目
在 CMD 命令行执行以下命令创建项目以及爬虫文件:

# 创建项目
1) scrapy startproject Title
# 进入项目
2) cd Title
# 创建爬虫文件

3)scrapy genspider title c.biancheng.net
编写代码
打开爬虫文件 title.py ,编写如下代码,其中一些代码 Scrapy 框架已经自动生成:

  1. 编写爬虫文件
import scrapy
class TitleSpider(scrapy.Spider):name = 'title'#要抓取数据的网站域名allowed_domains = ['c.biancheng.net']#第一个抓取的url,初始url,被当做队列来处理start_urls = ['http://c.biancheng.net/']def parse(self,response):#.extract():提取文本内容,将列表中所有元素序列化为Unicode字符串#.extract_first():提取列表中第1个文本内容# 以下是我们自己编写的代码,而自动生成的代码不用改动result = response.xpath('/html/head/title/text()').extract_first()print('-' * 60 )print(result)print('-' * 60)
  1. 修改配置文件
    下面修改 settings 文件的配置项,如下所示:
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',
}
  1. 使用Pycharm IDE运行项目
    为了省去终端敲命令的环节,您可以在项目中自定义一个运行文件 mian.py(注意:该文件与 scrapy.cfg 同目录),并编写如下代码:
from scrapy import cmdline
# 注意,cmdline.execute()是为了减少输入命令的操作,该方法的参数必须为列表。
# 执行爬虫文件来启动项目
cmdline.execute('scrapy crawl title'.split())
编写完成后,执行 main.py 文件,您会看到很多的输出内容,内容大致如下:
# scrapy 框架运行时输出的日志,包含很多信息,比如版本信息,执行过程等等
2021-04-09 16:35:15 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: Title)
2021-04-09 16:35:15 [scrapy.utils.log] INFO: Versions: lxml 4.5.0.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted
...
2021-04-09 16:35:16 [scrapy.middleware] INFO: Enabled downloader middlewares:
...
2021-04-09 16:35:16 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://docs.qq.com/doc/DV3FqZ1JDd0FScmtI/> (referer: None)
# 此处是我们要的信息
--------------------------------------------------
python教程入门学习:python程序设计微信公众号(入门教程、编程软件)
--------------------------------------------------
2021-04-09 16:35:16 [scrapy.core.engine] INFO: Closing spider (finished)
2021-04-09 16:35:16 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
#描述Scrapy执行状态,如请求次数,时间,接受字节数等
{'downloader/request_bytes': 231,
...

上述过程中,我们只在 title.py 中使用 Xpath 做了解析数据的操作,就拿到了我们想要的数据。由此可见 URL 入队出队, 发起 request 请求,返回 response 响应等操作都是由 Scrapy 框架自动完成的。
在 Scrapy 框架中,每个模块之间既紧密联系,但又相互独立,这样的设计减少了代码之间耦合度,是代码简洁易懂。

猫眼电影案例
最后,我们使用 Scrapy 框架完成一个完整的案例:抓取猫眼电影 Top100 榜。

  1. 创建项目
scrapy startproject Maoyan100
#进入项目目录
cd Maoyan100
# 创建爬虫文件,注意url 一定要是网站域名
scrapy genspider maoyan www.maoyan.com
  1. 定义数据结构
    首先在 items.py 中定义要抓取的数据结构,如下所示:
name = scrapy.Field()
star = scrapy.Field()
time = scrapy.Field()
  1. 编写爬虫文件
    接下来编写爬虫文件 maoyan.py 代码如下所示:
import scrapy
from Maoyan100.items import Maoyan100Item
class Maoyan100Spider(scrapy.Spider):# name 指定爬虫文件名字name = 'maoyan'allowed_domains = ['maoyan.com']  # 网站域名start_urls = ['https://maoyan.com/board/4?offset=0']  # 第一个要抓取的urloffset = 0  #查询字符串参数# response 为 start_urls中影响对象def parse(self,response):# 基准xpath,匹配电影信息的dd节点对象列表dd_list = response.xpath('//dl[@class="board-wrapper"]/dd')# 给items.py 中的类:Maoyan100Item()实例化item = Maoyan100Item()for dd in dd_list:item['name'] = dd.xpath('./a/@title').get().strip()  # 1.6以后版本使用   原来用 extract_first()item['star'] = dd.xpath('.//p[@class="star"]/text()').get().strip()item['time'] = dd.xpath('.//p[@class="releasetime"]/text()').get().strip()yield itemif self.offset < 90:  # 判断条件self.offset += 10url = 'https://maoyan.com/board/4?offset=' + str(self.offset)# 把url交给secheduer入队列# response会自动传给 callback 回调的 parse()函数 #Scrapy.request()向url发起请求,并将响应结果交给回调的解析函数yield scrapy.Request(url=url, callback=self.parse)
  1. 实现数据存储
    通过编写管道文件 pipelinse.py 文件实现数据的存储,将抓取的数据存放在 MySQL 数据库,这里需要提前建库、建表,因为前面章节已经创建过,此处不再赘述。代码编写如下:
import pymysql
from Maoyan100.settings import *
class Maoyan100Pipeline(object):def process_item(self, item, spider):print(item['name'], item['star'], item['time'])return item  # 多个管道有体现
# 存入mysql数据库的管道
class Maoyan100MysqlPipeline(object):#开始def open_spider(self, spider):# 爬虫项目启动,执行连接数据操作# 以下常量需要定义在settings配置文件中self.db = pymysql.connect(host=MYSQL_HOST,user=MYSQL_USER,password=MYSQL_PWD,database=MYSQL_DB,charset=MYSQL_CHARSET)self.cursor = self.db.cursor()# 向表中插入数据def process_item(self, item, spider):ins = 'insert into movieinfo values(%s,%s,%s)'L = [item['name'], item['star'], item['time']]self.cursor.execute(ins, L)self.db.commit()return item# 结束存放数据,在项目最后一步执行def close_spider(self, spider):# close_spider()函数只在所有数据抓取完毕后执行一次,self.cursor.close()self.db.close()print('执行了close_spider方法,项目已经关闭')
  1. 定义启动文件
    下面定义项目启动文件 run.py, 代码如下:
from scrapy import cmdline
#执行爬虫文件 -o 指定输出文件的格式
cmdline.execute('scrapy crawl maoyan -o maoyan.csv'.split())
#执行项目,并且将数据存csv文件格式

注意:指定 -o 参数,可以将数据以特定的文件格式保存,比如 csv、txt、josn 等。

  1. 修改配置文件
    最后修改配置文件,主要有修改以下内容:添加日志输出、激活管道 pipelines、定义数据库常量,以及其他一些常用选项,如下所示:
#设置 robots.txt 为False
ROBOTSTXT_OBEY = False
#设置日志级别: DEBUG < INFO < WARNING < ERROR < CRITICAL
#日志需要自己添加,配置文件中没有,在空白处添加即可
LOG_LEVEL='DEBUG'
#定义日志输出文件
LOG_FILE='maoyan.log'
#设置导出数据的编码格式
FEED_EXPORT_ENCODING='utf-8'
#设置下载器延迟时间,秒为单位
DOWNLOAD_DELAY = 1
#请求头,添加useragent等信息
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
}
#激活管道,并添加数据存放mysql的类,200为执行优先级
ITEM_PIPELINES = {'Maoyan100.pipelines.Maoyan100Pipeline': 300,# 执行数据存储mysql'Maoyan100.pipelines.Maoyan100MysqlPipeline': 200}
#在配置文件末尾添加mysql常用变量
MYSQL_HOST='localhost'
MYSQL_USER='root'
MYSQL_PWD='123456'
MYSQL_DB='maoyandb'
MYSQL_CHARSET='utf8'

最后执行 run.py 文件,日志文件 maoyan.log 内容大致如下:
2021-04-09 19:38:11 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: Maoyan100)
2021-04-09 19:38:11 [scrapy.utils.log] INFO: Versions: lxml 4.5.0.0, libxml2 2.9.5, cssselect 1.1.0

2021-04-09 19:38:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://maoyan.com/board/4?offset=0>

{‘name’: ‘我不是药神’, ‘star’: ‘主演:徐峥,周一围,王传君’, ‘time’: ‘上映时间:2018-07-05’}
2021-04-09 19:38:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://maoyan.com/board/4?offset=0>

{‘name’: ‘肖申克的救赎’,
‘star’: ‘主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿’,

maoyan.csv 文件大致如下:
name,star,time
我不是药神,“主演:徐峥,周一围,王传君”,上映时间:2018-07-05
肖申克的救赎,“主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿”,上映时间:1994-09-10(加拿大)
绿皮书,“主演:维果·莫腾森,马赫沙拉·阿里,琳达·卡德里尼”,上映时间:2019-03-01
海上钢琴师,“主演:蒂姆·罗斯,比尔·努恩,克兰伦斯·威廉姆斯三世”,上映时间:2019-11-15
小偷家族,“主演:中川雅也,安藤樱,松冈茉优”,上映时间:2018-08-03
哪吒之魔童降世,“主演:吕艳婷,囧森瑟夫,瀚墨”,上映时间:2019-07-26
霸王别姬,“主演:张国荣,张丰毅,巩俐”,上映时间:1993-07-26

黑天鹅,“主演:娜塔莉·波特曼,文森特·卡索,米拉·库妮丝”,上映时间:2010-09-01(意大利)

Python Scrapy爬虫框架实战应用相关推荐

  1. Python Scrapy爬虫框架爬取51job职位信息并保存至数据库

    Python Scrapy爬虫框架爬取51job职位信息并保存至数据库 -------------------------------- 版权声明:本文为CSDN博主「杠精运动员」的原创文章,遵循CC ...

  2. Python Scrapy 爬虫框架爬取推特信息及数据持久化!整理了我三天!

    最近要做一个国内外新冠疫情的热点信息的收集系统,所以,需要爬取推特上的一些数据,然后做数据分类及情绪分析.作为一名合格的程序员,我们要有「拿来主义精神」,借助别人的轮子来实现自己的项目,而不是从头搭建 ...

  3. 崔老哥python scrapy爬虫框架入门

    Scrapy 爬虫框架入门案例详解 Scrapy入门 创建项目 创建Spider 创建Item 解析Response 使用Item 后续Request 保存到文件 使用Item Pipeline 源代 ...

  4. python学习框架图-Python Scrapy爬虫框架学习

    Scrapy 是用Python实现一个为爬取网站数据.提取结构性数据而编写的应用框架. 一.Scrapy框架简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数 ...

  5. Python Scrapy爬虫框架学习!半小时掌握它!

    Scrapy 是用Python实现一个为爬取网站数据.提取结构性数据而编写的应用框架. 一.Scrapy框架简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数 ...

  6. Scrapy爬虫框架管道文件pipelines数据图像存储

    Scrapy爬虫框架管道文件pipelines Scrapy爬虫框架管道文件pipelines 一.pipelines的通用性 二.pipelines的主要功能 1.对数据进行后处理,清洗,去重,融合 ...

  7. Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB

    ​    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...

  8. Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB

    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...

  9. Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    (1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...

最新文章

  1. Selenium+python --获取百度联想词
  2. Android添加垂直滚动scrollview
  3. 安装失败java.lang_linux安装jdk出现java/lang/NoClassDefFoundError: java/lang/Object错误的解决方案...
  4. A - Tit for Tat CodeForces - 1516A
  5. java 换行分割_用Java开发自己的Kubernetes控制器,想试试吗?
  6. 共享主机与虚拟机文件方式一
  7. PetShop 4.0知识点:base 关键字用于从派生类中访问基类的成员
  8. Spring 与 Hibernate 集成 Transactional设置为只读
  9. OpenCV像素二位数组数据(矩阵)生成图片
  10. vue分享卡住_vue init webpack卡住无反应??
  11. 【图像去噪】基于matlab中值+均值+Lee+Kuan图像滤波【含Matlab源码 1179期】
  12. java excel导出下载_Java导出excel并下载功能
  13. python爬虫:爬取携程航班数据
  14. 计算机说课稿模板小学数学,小学数学说课万能模板精简
  15. [渝粤教育] 西北农林科技大学 土壤学 参考 资料
  16. 适合孕妇吃的低糖水果
  17. 如何搭建自己的网站别人可以直接访问
  18. 综合应用_6多字符串-烟锁池塘柳
  19. 蓝桥杯个人总结(入门练习-VIP题)
  20. 免Root卸载系统预装应用

热门文章

  1. GPU模拟猴子大脑,普通台式机变超算,英国大学研究登上Nature子刊
  2. 图神经网络越深,表现就一定越好吗?
  3. 这个B站up主太硬核了!纯手工打造AI小电视:硬件自己焊接,驱动代码全手写...
  4. GitHub 标星 7k+,面试官的灵魂 50 问,问到你怀疑人生!
  5. Python设计模式-中介者模式
  6. 模型类序列化器ModelSerializer
  7. Numpy中数组间运算
  8. Linux之查找文件命令
  9. python之⾯向对象-多态
  10. 实验三 JSP应用开发进阶