python网络爬虫(14)使用Scrapy搭建爬虫框架
目的意义
爬虫框架也许能简化工作量,提高效率等。scrapy是一款方便好用,拓展方便的框架。
本文将使用scrapy框架,示例爬取自己博客中的文章内容。
说明
学习和模仿来源:https://book.douban.com/subject/27061630/。
创建scrapy工程
首先当然要确定好,有没有完成安装scrapy。在windows下,使用pip install scrapy,慢慢等所有依赖和scrapy安装完毕即可。然后输入scrapy到cmd中测试。
建立工程使用scrapy startproject myTestProject,会在工程下生成文件。


一些介绍说明
在生成的文件中,
创建爬虫模块-下载
在路径./myTestProject/spiders下,放置用户自定义爬虫模块,并定义好name,start_urls,parse()。
如在spiders目录下建立文件CnblogSpider.py,并填入以下:
import scrapy
class CnblogsSpider(scrapy.Spider):
name="cnblogs"
start_urls=["https://www.cnblogs.com/bai2018/default.html?page=1"]
def parse(self,response):
pass
在cmd中,切换到./myTestProject/myTestProject下,再执行scrapy crawl cnblogs(name)测试,观察是否报错,响应代码是否为200。其中的parse中参数response用于解析数据,读取数据等。
强化爬虫模块-解析
在CnblogsSpider类中的parse方法下,添加解析功能。通过xpath、css、extract、re等方法,完成解析。
调取元素审查分析以后添加,成为以下代码:
import scrapy
class CnblogsSpider(scrapy.Spider):
name="cnblogs"
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
papers=response.xpath(".//*[@class='day']")
for paper in papers:
url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()
title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
content=paper.xpath(".//*[@class='postCon']/div/text()").extract()
print(url,title,time,content)
pass
找到页面中,class为day的部分,然后再找到其中各个部分,提取出来,最后通过print方案输出用于测试。
在正确的目录下,使用cmd运行scrapy crawl cnblogs,完成测试,并观察显示信息中的print内容是否符合要求。
强化爬虫模块-包装数据
包装数据的目的是存储数据。scrapy使用Item类来满足这样的需求。
框架中的items.py用于定义存储数据的Item类。
在items.py中修改MytestprojectItem类,成为以下代码:
import scrapy
class MytestprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
url=scrapy.Field()
time=scrapy.Field()
title=scrapy.Field()
content=scrapy.Field()
pass
然后修改CnblogsSpider.py,成为以下内容:
import scrapy
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):
name="cnblogs"
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
papers=response.xpath(".//*[@class='day']")
for paper in papers:
url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()
title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
content=paper.xpath(".//*[@class='postCon']/div/text()").extract() item=MytestprojectItem(url=url,title=title,time=time,content=content)
yield item
pass
将提取出的内容封装成Item对象,使用关键字yield提交。
强化爬虫模块-翻页
有时候就是需要翻页,以获取更多数据,然后解析。
修改CnblogsSpider.py,成为以下内容:
import scrapy
from scrapy import Selector
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):
name="cnblogs"
allowd_domains=["cnblogs.com"]
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
papers=response.xpath(".//*[@class='day']")
for paper in papers:
url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()
title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
content=paper.xpath(".//*[@class='postCon']/div/text()").extract() item=MytestprojectItem(url=url,title=title,time=time,content=content)
yield item
next_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')
if next_page:
yield scrapy.Request(url=next_page[0],callback=self.parse)
pass
在scrapy的选择器方面,使用xpath和css,可以直接将CnblogsSpider下的parse方法中的response参数使用,如response.xpath或response.css。
而更通用的方式是:使用Selector(response).xxx。针对re则为Selector(response).re。
关于yield的说明:https://blog.csdn.net/mieleizhi0522/article/details/82142856
强化爬虫模块-存储
当Item在Spider中被收集时候,会传递到Item Pipeline。
修改pipelines.py成为以下内容:
import json
from scrapy.exceptions import DropItem
class MytestprojectPipeline(object):
def __init__(self):
self.file=open('papers.json','wb')
def process_item(self, item, spider):
if item['title']:
line=json.dumps(dict(item))+"\n"
self.file.write(line.encode())
return item
else:
raise DropItem("Missing title in %s"%item)
重新实现process_item方法,收集item和该item对应的spider。然后创建papers.json,转化item为字典,存储到json表中。
另外,根据提示打开pipelines.py的开关。在settings.py中,使能ITEM_PIPELINES的开关如下:

然后在cmd中执行scrapy crawl cnblogs即可
另外,还可以使用scrapy crawl cnblogs -o papers.csv进行存储为csv文件。
需要更改编码,将csv文件以记事本方式重新打开,更正编码后重新保存,查看即可。
强化爬虫模块-图像下载保存
设定setting.py
ITEM_PIPELINES = {
'myTestProject.pipelines.MytestprojectPipeline':300,
'scrapy.pipelines.images.ImagesPipeline':1
}
IAMGES_STORE='.//cnblogs'
IMAGES_URLS_FIELD = 'cimage_urls'
IMAGES_RESULT_FIELD = 'cimages'
IMAGES_EXPIRES = 30
IMAGES_THUMBS = {
'small': (50, 50),
'big': (270, 270)
}
修改items.py为:
import scrapy
class MytestprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
url=scrapy.Field()
time=scrapy.Field()
title=scrapy.Field()
content=scrapy.Field() cimage_urls=scrapy.Field()
cimages=scrapy.Field()
pass
修改CnblogsSpider.py为:
import scrapy
from scrapy import Selector
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):
name="cnblogs"
allowd_domains=["cnblogs.com"]
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
papers=response.xpath(".//*[@class='day']")
for paper in papers:
url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
content=paper.xpath(".//*[@class='postCon']/div/text()").extract() item=MytestprojectItem(url=url,title=title,time=time,content=content)
request=scrapy.Request(url=url, callback=self.parse_body)
request.meta['item']=item yield request
next_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')
if next_page:
yield scrapy.Request(url=next_page[0],callback=self.parse)
pass def parse_body(self, response):
item = response.meta['item']
body = response.xpath(".//*[@class='postBody']")
item['cimage_urls'] = body.xpath('.//img//@src').extract()
yield item
总之,修改以上三个位置。在有时候配置正确的时候却出现图像等下载失败,则可能是由于setting.py的原因,需要重新修改。
启动爬虫
建立main函数,传递初始化信息,导入指定类。如:
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings from myTestProject.spiders.CnblogSpider import CnblogsSpider if __name__=='__main__':
process = CrawlerProcess(get_project_settings())
process.crawl('cnblogs')
process.start()
修正
import scrapy
from scrapy import Selector
from cnblogSpider.items import CnblogspiderItem
class CnblogsSpider(scrapy.Spider):
name="cnblogs"
allowd_domains=["cnblogs.com"]
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
papers=response.xpath(".//*[@class='day']")
for paper in papers:
urls=paper.xpath(".//*[@class='postTitle']/a/@href").extract()
titles=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
times=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
contents=paper.xpath(".//*[@class='postCon']/div/text()").extract()
for i in range(len(urls)):
url=urls[i]
title=titles[i]
time=times[0]
content=contents[i]
item=CnblogspiderItem(url=url,title=title,time=time,content=content)
request = scrapy.Request(url=url, callback=self.parse_body)
request.meta['item'] = item
yield request
next_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')
if next_page:
yield scrapy.Request(url=next_page[0],callback=self.parse)
pass def parse_body(self, response):
item = response.meta['item']
body = response.xpath(".//*[@class='postBody']")
item['cimage_urls'] = body.xpath('.//img//@src').extract()
yield item
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=813cva9t28s6
python网络爬虫(14)使用Scrapy搭建爬虫框架的更多相关文章
- Python网络编程相关的库与爬虫基础
PythonWeb编程 ①相关的库:urlib.urlib2.requests python中自带urlib和urlib2,他们主要使用函数如下: urllib: urlib.urlopen() ur ...
- 5、爬虫系列之scrapy框架
一 scrapy框架简介 1 介绍 (1) 什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能 ...
- 爬虫系列之Scrapy框架
一 scrapy框架简介 1 介绍 (1) 什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能 ...
- 爬虫开发7.scrapy框架简介和基础应用
scrapy框架简介和基础应用阅读量: 1432 scrapy 今日概要 scrapy框架介绍 环境安装 基础使用 今日详情 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数 ...
- Python网络爬虫之Scrapy框架(CrawlSpider)
目录 Python网络爬虫之Scrapy框架(CrawlSpider) CrawlSpider使用 爬取糗事百科糗图板块的所有页码数据 Python网络爬虫之Scrapy框架(CrawlSpider) ...
- 【python 网络爬虫】之scrapy系列
网络爬虫之scripy系列 [scrapy网络爬虫]之0 爬虫与反扒 [scrapy网络爬虫]之一 scrapy框架简介和基础应用 [scrapy网络爬虫]之二 持久化操作 [scrapy网络爬虫]之 ...
- python网络爬虫(2)——scrapy框架的基础使用
这里写一下爬虫大概的步骤,主要是自己巩固一下知识,顺便复习一下. 一,网络爬虫的步骤 1,创建一个工程 scrapy startproject 工程名称 创建好工程后,目录结构大概如下: 其中: sc ...
- 16.Python网络爬虫之Scrapy框架(CrawlSpider)
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- Python网络爬虫-Scrapy框架
一.简介 Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适. 二.使用 1.创建sc ...
随机推荐
- 编译安装python
编译安装python 1.下载python3的原码包 1.1下载到到opt目录中 cd /opt 1.2下载python3的原码包 wget https://www.python.org/ftp/py ...
- 第四章 自定义sol合约转化java代码,并实现调用
鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 准备工作 1.官方参考说明文档 https:/ ...
- java多线程之线程安全
线程安全和非线程安全是多线程的经典问题,非线程安全会在多个线程对同一个对象并发访问时发生. 注意1: 非线程安全的问题存在于实例变量中,如果是方法内部的私有变量,则不存在非线程安全问题. 实例变量是对 ...
- 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解(转)
ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器. ...
- Hexo+NexT(三):Next主题配置详解
阅读本篇之前,假定读者已经有了Node.js的基础,如需要补充Node.js知识的,请自行百度. Hexo是在Node.js框架下的一个项目,利用Node.js提供的强大功能,完成从Markdown到 ...
- 查看weblgic/Tuxedo/WebSpere(WAS)/Tomcat中间件版本
1.中间件 1.1 Weblogic WebLogic的版本信息.JDK信息.参数配置均可通过控制台查看. 软件版本 [命令]more /weblogic/bea/logs/log.tx ...
- Spark学习之路(十三)—— Spark Streaming 与流处理
一.流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中.应用程序根据需要查询数据或计算数据.这就是传统的静态数据处理架构.Hadoop采用HDFS进行数据 ...
- Spark学习之路(十一)—— Spark SQL 聚合函数 Aggregations
一.简单聚合 1.1 数据准备 // 需要导入spark sql内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSess ...
- .NetCore中三种注入方式的思考
该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...
- POJ 1986:Distance Queries(倍增求LCA)
http://poj.org/problem?id=1986 题意:给出一棵n个点m条边的树,还有q个询问,求树上两点的距离. 思路:这次学了一下倍增算法求LCA.模板. dp[i][j]代表第i个点 ...