Python网络爬虫《九》
Scrapy爬虫框架
安装 : pip install scrapy
测试成功 : scrapy -h
Scrapy爬虫框架“5+2”结构:
Scrapy主要组件:
- 引擎(Engine)
用来控制所有模块之间的数据流, 触发事务(框架核心)
- 下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
- 爬虫(Spiders)
解析Downloader返回的响应(Response);产生爬取项(scrapy item);产生额外的爬取请求(Request)
- 项目管道(Item Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送 到项目管道,并经过几个特定的次序(流水线)处理数据。
- 下载器中间件(Downloader Middlewares)
位于引擎和下载器之间的框架,主要是处理引擎与下载器之间的请求及响应,丢弃、修改、新增。
- 调度中间件(Scheduler Middewares)
介于引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
- 爬虫中间件(Spider Middlewares)
介于引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
- 调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
Request vs Scrapy
Request | Scrapy |
页面级爬虫 | 网站级爬虫 |
功能库 | 框架 |
并发性考虑不足 | 并发性好,性能高 |
重点在于页面下载 | 重点在于爬虫结构 |
定制灵活 | 一般定制灵活,深度定制困难 |
上手简单 | 入门稍难 |
Scrapy运行流程:
- 引擎从调度器中取出一个链接(URL)用于接下来的抓取
- 引擎把URL封装成一个请求(Request)传给下载器
- 下载器把资源下载下来,并封装成应答包(Response)
- 爬虫解析Response
- 解析出实体(Item),则交给实体管道进行进一步的处理
- 解析出的是链接(URL),则把URL交给调度器等待抓取
Scrapy使用形式:命令行
查看所有命令
scrapy -h
查看帮助信息
scapy --help
查看版本信息
scrapy version #Scrapy 1.1.2
scrapy version -v
Scrapy : 1.5.0
lxml : 4.1.1.0
libxml2 : 2.9.5
cssselect : 1.0.3
parsel : 1.3.1
w3lib : 1.18.0
Twisted : 17.9.0
Python : 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)]
pyOpenSSL : 17.5.0 (OpenSSL 1.1.0g 2 Nov 2017)
cryptography : 2.1.4
Platform : Windows-10-10.0.14393
完整配置并实现Scrapy爬虫的过程:
- 建立工程和Spider模板
- 编写Spider
- 编写Pipeline
- 配置优化
Scrapy爬虫的数据类型:
- Request类:
1、cless scrapy.http.Request();2、request对象表示一个HTTP请求;3、由Spider生成,由Downloader执行
- Response类
1、cless scrapy.http.Response();2、response对象表示一个HTTP请求;3、由Downloader生成,由Spider处理
- Item类
1、cless scrapy.item.Item();2、item对象表示从HTML页面中提取的信息内容;3、由Spider生成,由Item Pipeline处理4、可以按照字典类型操作;
Scrapy爬虫支持的HTML信息提取方法:
- Beautiful Soup
- lxml
- re
- XPath Selector
- CSS Selector
yield关键字的使用:
Iterables
当你创建一个list,你可以一个一个的获取,这种列表就称为迭代:
mylist = [1, 2, 3]for i in mylist:print(i) #1 2 3
mylist 是一个迭代器. 当你理解它为一个list,它便是可迭代的:
mylist =
[x*x for x in range(3)]
for i in mylist:print(i) #0 1 4
任何可以用 for ..in.. 来迭代读取的都是迭代容器,如lists,strings,files.需要存储所有的值,其中很多值没有必要每次都保持在内存中。
Generators
Generators(生成器)是可迭代的,每次只能迭代一次,因为不是所有的迭代器都被一直存储在内存中的:
mygenerator =
(x*x for x in range(3))
for i in mygenerator:print(i) #0 1 4
生成0然后丢弃,继续统计1,接着是4;
Yield
Yield返回一个生成器,例如:
def createGenerator():mylist = range(3)for i in mylist:yield i*imygenerator = createGenerator() # 创建generatorprint(mygenerator) # mygenerator 是一个对象! 输出<generator object createGenerator at 0xb7555c34>for i in mygenerator:print(i) #0 1 4
当调用creatGenerator
的时候,这个函数中的代码并没有真正运行。它仅仅返回一个生成器对象,
代码会在每次for使用生成器的时候跑起来。
练习案例:
入门篇:美剧天堂前100最新(http://www.meijutt.com/new100.html)
1、创建工程
1
|
scrapy startproject movie
|
2、创建爬虫程序
1
2
|
cd movie
scrapy genspider meiju meijutt.com #生成meiju.py----
|
3、自动创建目录及文件
4、文件说明:
- _init_.py 初始化脚本
- scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
- items.py 设置数据存储模板,用于结构化数据,如:Django的Model
- pipelines.py Pipelines代码模板(继承类),数据处理行为,如:一般结构化的数据持久化
- middlewares.py Middlewares代码模板(继承类)
- settings.py Scrapy的配置文件,如:递归的层数、并发数,延迟下载等
- spiders 爬虫目录,如:创建文件,编写爬虫规则
注意:一般创建爬虫文件时,以网站域名命名。
5、设置数据存储模板
items.py
1
2
3
4
5
6
|
import scrapy
class MovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field()
|
6、编写爬虫
meiju.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# -*- coding: utf-8 -*-
import scrapy
from movie.items import MovieItem
class MeijuSpider(scrapy.Spider): # 继承scrapy.spider
name = "meiju"
allowed_domains = [ "meijutt.com" ] #最开始用户提交给命令行的域名,只能爬取该域名以下的内容
start_urls = [ 'http://www.meijutt.com/new100.html' ] #要爬取的初始页面
def parse(self, response): #解析页面方法:用于处理响应,解析内容形成字典,发现新的URL爬取请求
movies = response.xpath( '//ul[@class="top-list fn-clear"]/li' )
for each_movie in movies:
item = MovieItem()
item[ 'name' ] = each_movie.xpath( './h5/a/@title' ).extract()[0]
yield item
|
7、设置配置文件
settings.py增加如下内容
1
|
ITEM_PIPELINES = { 'movie.pipelines.MoviePipeline' :100}
|
8、编写数据处理脚本
pipelines.py
1
2
3
4
|
class MoviePipeline( object ):
def process_item(self, item, spider):
with open( "my_meiju.txt" , 'a' ) as fp:
fp.write(item[ 'name' ].encode( "utf8" ) + '\n' )
|
9、执行爬虫
1
2
|
cd movie
scrapy crawl meiju --nolog
|
10、结果显示
Python网络爬虫《九》相关推荐
- 爬虫书籍-Python网络爬虫权威指南OCR库 NLTK 数据清洗 BeautifulSoup Lambda表达式 Scrapy 马尔可夫模型
Python网络爬虫权威指南 编辑推荐 适读人群 :需要抓取Web 数据的相关软件开发人员和研究人员 作为一种采集和理解网络上海量信息的方式,网页抓取技术变得越来越重要.而编写简单的自动化程序(网络爬 ...
- python网络爬虫_Python网络爬虫——爬取视频网站源视频!
原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...
- 《精通Python网络爬虫:核心技术、框架与项目实战》——1.3 网络爬虫的组成...
本节书摘来自华章出版社<精通Python网络爬虫:核心技术.框架与项目实战>一书中的第1章,第1.3节,作者 韦 玮,更多章节内容可以访问云栖社区"华章计算机"公众号查 ...
- python商业爬虫教程_廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程...
廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程 1.JPG (53.51 KB, 下载次数: 1) 2019-8-9 08:15 上传 2.JPG ...
- python爬虫教程视频下载-利用Python网络爬虫获取电影天堂视频下载链接【详细教程】...
相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态. 今天以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来. [二.项目准备] ...
- python网络爬虫权威指南 百度云-分析《Python网络爬虫权威指南第2版》PDF及代码...
对那些没有学过编程的人来说,计算机编程看着就像变魔术.如果编程是魔术(magic),那么网页抓取(Web scraping)就是巫术(wizardry),也就是运用"魔术"来实现精 ...
- python爬虫文件代码大全-Python网络爬虫实战项目代码大全(长期更新,欢迎补充)...
WechatSogou[1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典.[1]: https://github ...
- 精通python网络爬虫-精通python网络爬虫
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 作者:韦玮 转载请注明出处 随着大数据时代的到来,人们对数据资源的需求越来越多, ...
- python爬虫程序-Python网络爬虫实战(一)快速入门
本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...
- 精通python网络爬虫-精通Python网络爬虫 PDF 高清版
给大家带来的一篇关于Python爬虫相关的电子书资源,介绍了关于Python.网络爬虫.核心技术.框架.项目实战方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小108.6 MB,韦玮编写 ...
最新文章
- 企业选择数据中心的建议
- 小程序云服务器选什么系统好,小程序云服务器操作系统选择
- iOS之深入解析少见却神奇的NSProxy类的多种使用
- python 进行一元线性回归并输出相关结果_Python实现一元线性回归实战
- 内核编译(make)
- 实践单元测试(2) - 大话单元测试
- centos7的网络配置
- Java集合--LinkedList
- linux下u盘的使用
- python判断英文字母_python判断字符串是否包含字母
- C | 扫雷游戏完整版
- 【笔记】74HC573的一些记录
- java集合中取最大值_Java后台通过Collections获取list集合中最大数,最小数代码
- 浅谈大数据专业的就业前景
- 关于软件界面设计、控件颜色搭配、一些实用建议(偷懒技巧)总结——针对C# WinForm/WPF技术
- 雷柏 V500PRO Win键失效
- 《晚风》 带来阵阵清凉
- 利用Python进行数据分析的学习笔记——chap6
- 在C语言中各种数据类型各占多少位 C语言 中结构体的位域(位段)
- 现代控制理论1——前期理论体系
热门文章
- 阿里巴巴集团CTO张建锋:将开放阿里的技术能力
- 青春校园小说:天使会爱上恶魔【完】『看了绝对上瘾』(欢迎转载)
- 硕飞烧录器、卓晶微烧录机使用
- 【Multisim】模拟电子技术综合设计实验:正弦波、方波、三角波信号发生器的设计与搭建
- FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
- CORDIC实现FPGA复数求模(Xilinx CORDIC IP 6.0)
- java复数类求模_用java定义一个复数类Complex,能够创建复数对象,并且实现复数之间的加、减运算 用java编写一个复数类...
- spring boot引入JDK的jar,Jenkins自动化部署出错
- ambiguous column name 错误
- 利用Python进行博客图片压缩