目的意义

爬虫框架也许能简化工作量,提高效率等。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 itempass

将提取出的内容封装成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 itemnext_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 itemelse: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']=itemyield requestnext_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')if next_page:yield scrapy.Request(url=next_page[0],callback=self.parse)passdef 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_settingsfrom myTestProject.spiders.CnblogSpider import CnblogsSpiderif __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'] = itemyield requestnext_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')if next_page:yield scrapy.Request(url=next_page[0],callback=self.parse)passdef 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

转载于:https://www.cnblogs.com/bai2018/p/11255185.html

python网络爬虫(14)使用Scrapy搭建爬虫框架相关推荐

  1. Python+Pycharm +Scrapy搭建爬虫项目

    Python+Pycharm +Scrapy搭建爬虫项目 Scrapy简介: Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系 ...

  2. python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC

    首先介绍一下scrapy. Scrapy一个开源和协作的框架,是为了页面抓取所设计的,使用它可以快速.简单.可扩展(通过中间件)的方式从网站中提取所需的数据. 工作流程如下 Scrapy Engine ...

  3. python: 网络编程及fastapi快速搭建web服务器

    一.网络编程 1.网络编程三要素 ip地址.端口.TCP协议 ip地址 ip地址作用: 根据ip地址能够找到网络中的具体设备(电脑,打印机) ip地址概念: ip地址是网络设备的唯一标识 ip地址分类 ...

  4. Python网络爬虫入门

    Python网络爬虫入门 网络爬虫(web crawler),也叫网络蜘蛛(Web Spider).网络机器人(Internet Bot).简单地说,抓取万维网(World Wide Web)上所需要 ...

  5. python爬虫学习笔记-scrapy框架(1)

    简介 什么是框架? 所谓的框,其实说白了就是一个[项目的半成品],该项目的半成品需要被集成了各种功能且具有较强的通用性. Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名, ...

  6. Python爬虫——Scrapy通用爬虫

    大家好,我是霖hero 除了钱,大家还比较喜欢什么?当然是全能.万能和通用的人或事物啦,例如:全能.什么都会的员工.万能钥匙.通用爬虫等等.今天我们学习Scrapy通用爬虫,利用Scrapy通用爬虫来 ...

  7. python import request 不报错_爬虫学习路径整理及安装环境遇到的坑

    学习路径是我自己提炼和精选的,只适合我个人,因为虽然有技术基础但是我刚入门爬虫视野很窄不专业,为避免误导你们,你们最好参考知乎上大牛已经回答的好答案.我发这篇文章,目的是给自己看的.ps,专栏下每篇文 ...

  8. Scrapy分布式爬虫打造搜索引擎 - (三)知乎网问题和答案爬取

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 推荐前往我的个人博客进行阅读:http://blog.mtiany ...

  9. 爬虫进阶 之 Scrapy 框架 1(实例: 爬取ITcast 的教师信息)

    Scrapy 什么是Scrapy 简介 Scrapy 架构 使用Scrapy 爬取 ITcast 什么是Scrapy 简介 Scrapy是适用于Python的一个快速.高层次的屏幕抓取和web抓取框架 ...

最新文章

  1. c语言 爬虫 socket,爬虫遇到 Socket,莫慌,肝就完了!
  2. 数组 最大差值_数组两元素的最大差:从暴力到多线程
  3. 中间凸起_谢娜缺席湖南台跨年,何炅收礼风波后站中间真一哥,汪涵冷漠疏离...
  4. 20170314--服务器监控
  5. eclipse adt如何切换到设计界面_如何将你的UI界面设计的更精致?不仅仅是运用对比,还要注意细节 | 分享...
  6. 企业数字化转型战略权威指南
  7. 乐优购物学习笔记(5)
  8. CDD数据库文件制作(三)——DID
  9. POM 标签大全详解
  10. 迁移学习与小样本学习
  11. 【表单设计】优秀表单设计案例
  12. 【语音从零之五】用科大讯飞语音包实现语音打开已安装应用程序
  13. 好久没在线了,恩进修(偷懒)中,hahaha~整理一下
  14. Linux系统调用之lseek函数
  15. Linux之pstree命令
  16. k8s里面的iptables和ipvs有什么区别?怎么选?为什么选择ipvs
  17. Java获取国内各个地区实时天气
  18. 浅谈Winform程序的界面布局设计
  19. STM32F103点亮LED灯
  20. php 元组,C++_浅析C++标准库元组(tuple)源码,一、什么是元组 元组不是什 - phpStudy...

热门文章

  1. SQL Server 2005异地备份
  2. 【CyberSecurityLearning 58】PHP代码注入
  3. Jackson 配置 ObjectMapper
  4. centos系统中kaptcha没有按指定的字体显示验证码问题解决
  5. C语言模拟实现(二)-----可变分区存储管理方式
  6. Linux动态频率调节系统CPUFreq
  7. 知识图谱实践篇(四):Apache jena SPARQL endpoint及推理
  8. Ethermint部署及框架解析
  9. Filecoin: 影响力容错(PFT)和预期共识(EC)
  10. android app通过Geth RPC接口实现远程调用