使用Scrapy,帮你快速抓取网页数据(代码可下载)!
Scrapy 是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网站数据、提取结构性数据以及各种图片,非常方便。Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。尽管Scrapy原本是设计用来屏幕抓取(更精确的说,是网络抓取),但它也可以用来访问API来提取数据。
如何安装?
打开网站:
https://www.lfd.uci.edu/~gohlke/pythonlibs/
在这个python第三方库里下载三个包:分别是lxml,twisted,scrapy。
我下载的是:
lxml-4.3.2-cp37-cp37m-win_amd64.whl
Scrapy-1.6.0-py2.py3-none-any.whl
Twisted-18.9.0-cp37-cp37m-win_amd64.whl
cd 到放这三个包的文件夹下,依次pip3 install 上述三个.whl文件。
例如:
pip3 install lxml-4.3.2-cp37-cp37m-win_amd64.whl
pip3 install Twisted-18.9.0-cp37-cp37m-win_amd64.whl
pip3 install Scrapy-1.6.0-py2.py3-none-any.whl
全部安装完后,直接在命令行输入scrapy,看是否出现以下提示,如果出现则说明安装成功。
Scrapy 1.6.0 - no active project
Usage:
scrapy <command> [options] [args]
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
[ more ] More commands available when run from project directory
Use "scrapy <command> -h" to see more info about a command
如果没有成功,在下面网址上下载相应的win插件。
https://sourceforge.net/projects/pywin32/files/pywin32/Build 221/
架构和流程
Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下
Scrapy主要包括了以下组件:
引擎(Scrapy)
用来处理整个系统的数据流, 触发事务(框架核心)
调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
爬虫中间件(Spider Middlewares)
介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
调度中间件(Scheduler Middewares)
介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
Scrapy运行流程大概如下:
引擎从调度器中取出一个链接(URL)用于接下来的抓取
引擎把URL封装成一个请求(Request)传给下载器
下载器把资源下载下来,并封装成应答包(Response)
爬虫解析Response
解析出实体(Item),则交给实体管道进行进一步的处理
解析出的是链接(URL),则把URL交给调度器等待抓取
如何开始?
制作 Scrapy 爬虫一共需要四步:
新建项目:新建一个新的爬虫项目
明确目标(编写items.py):明确你想要抓取的目标
制作爬虫(spiders/xxspider.py):制作爬虫开始爬取网页
存储内容(pipelines.py):设计管道存储爬取内容
豆瓣读书频道书籍信息爬取
创建工程
scrapy startproject pic
创建爬虫程序
cd pic
scrapy genspider book douban.com
自动创建目录及文件
文件说明:
scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
items.py 设置数据存储模板,用于结构化数据,如:Django的Model
pipelines 数据处理行为,如:一般结构化的数据持久化
settings.py 配置文件,如:递归的层数、并发数,延迟下载等
spiders 爬虫目录,如:创建文件,编写爬虫规则
注意:一般创建爬虫文件时,以网站域名命名
设置数据存储模板
items.py
import scrapy
class PicItem(scrapy.Item):
addr = scrapy.Field()
name = scrapy.Field()
编写爬虫
book.py
# -*- coding: utf-8 -*-
import scrapy
import os
# 导入item中结构化数据模板
from pic.items import PicItem
class XhSpider(scrapy.Spider):
# 爬虫名称,唯一
name = "book"
# 允许访问的域
allowed_domains = ["douban.com"]
# 初始URL
start_urls = ['https://book.douban.com/']
def parse(self, response):
# 获取所有图片的a标签
allPics = response.xpath('//div[@class="cover"]/a')
for pic in allPics:
# 分别处理每个图片,取出名称及地址
item = PicItem()
name = pic.xpath('./img/@alt').extract()[0]
addr = pic.xpath('./img/@src').extract()[0]
item['name'] = name
item['addr'] = addr
# 返回爬取到的数据
yield item
设置配置文件
settings.py增加如下内容
ITEM_PIPELINES = {'pic.pipelines.PicPipeline':100}
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
编写数据处理脚本
pipelines.py
import urllib.request
import os
class PicPipeline(object):
def process_item(self, item, spider):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'}
req = urllib.request.Request(url=item['addr'],headers=headers)
res = urllib.request.urlopen(req)
file_name = os.path.join(r'down_pic',item['name']+'.jpg')
with open(file_name,'wb') as fp:
fp.write(res.read())
执行爬虫
scrapy crawl book --nolog
执行结果
(关注公众号 ,回复:0703,可获取源码!)
往期回顾
JupyterLab最全详解,如果你还在使用Notebook,那你就out了!
Pandas教程:初学者入门必备,很全面,很详解!
在windows上安装Pandas的两种简单方法(pip&anaconda)
史上最全的Python基础语法知识清单
Docker新手入门,最全详解看这里!
2020年使用最多的大数据分析工具
使用Scrapy,帮你快速抓取网页数据(代码可下载)!相关推荐
- cookie追加数据_集算器 SPL 抓取网页数据
[摘要] 集算器 SPL 支持抓取网页数据,根据抓取定义规则,可将网页数据下载到在本地进行统计分析.具体定义规则要求.使用详细情况,请前往乾学院:集算器 SPL 抓取网页数据! 网站上的数据源是我们进 ...
- excel数据自动录入网页_Excel自动抓取网页数据,数据抓取一键搞定
网站上的数据源是我们进行统计分析的重要信息源.我们在生活中常常听到一个词叫"爬虫",能够快速抓取网页上的数据,这对于数据分析相关工作来说极其重要,也是必备的技能之一.但是爬虫大多需 ...
- 利用pandas库中的read_html方法快速抓取网页中常见的表格型数据
利用pandas库中的read_html方法快速抓取网页中常见的表格型数据 本文转载自:https://www.makcyun.top/web_scraping_withpython2.html 需要 ...
- 【.NET】使用HtmlAgilityPack抓取网页数据
原文:[.NET]使用HtmlAgilityPack抓取网页数据 刚刚学习了XPath路径表达式,主要是对XML文档中的节点进行搜索,通过XPath表达式可以对XML文档中的节点位置进行快速定位和访问 ...
- python 抓取网页数据
python 抓取网页数据 此文解决如何从不同网页爬取数据的问题及注意事项,重点说明requests库的应用. 在开始之前,要郑重说明一下,不是每一个网页都可以爬取数据哦.有的网页涉及个人隐私或其他敏 ...
- Python 爬虫篇#笔记02# | 网页请求原理 和 抓取网页数据
目录 一. 网页请求原理 1.1 浏览网页的过程 1.2 统一资源定位符URL 1.3 计算机域名系统DNS 1.4 分析浏览器显示完整网页的过程 1.5 客户端THHP请求格式 1.6 服务端HTT ...
- python爬网页数据用什么_初学者如何用“python爬虫”技术抓取网页数据?
原标题:初学者如何用"python爬虫"技术抓取网页数据? 在当今社会,互联网上充斥着许多有用的数据.我们只需要耐心观察并添加一些技术手段即可获得大量有价值的数据.而这里的&quo ...
- web scraper 抓取网页数据的几个常见问题
如果你想抓取数据,又懒得写代码了,可以试试 web scraper 抓取数据. 相关文章: 最简单的数据抓取教程,人人都用得上 web scraper 进阶教程,人人都用得上 如果你在使用 web s ...
- php如何抓取网页内容,php如何抓取网页数据?
php抓取网页数据header("Content-type: text/html; charset=utf-8"); //$url = "https://www.cnbl ...
最新文章
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
- 揭秘 RocketMQ 新特性以及在金融场景下的实践
- 用JAVA制作小游戏——推箱子(二)
- 受“社保掌上通”APP影响 麦达数字遭深交所问询
- DiagnosticsTextBox:WinForms的日志窗口
- jQuery制作带有微信二维码扫描的页面返回顶部代码
- 华为的哪个字体像苹果的_华为默认字体是什么字体
- python投资组合有效边界,【python量化】如何用Python找到投资时的最佳组合比例
- Android计算器横屏,如何将华为手机的计算器横屏转换成竖屏
- 《资治通鉴》曾参三人成“真”、胡服骑射、吕不韦
- Audio Hijack教程:轻松捕获iOS设备中的音频
- 保护用户隐私 VS 反对不正当竞争
- 外链对网站的作用(2022网站还有必要做外链吗)
- 如何用GBD确认函数属于哪个库
- Notepad++插件: HexEditor
- 【Python】小甲鱼Python学习总结——代码版
- 文本关键词的提取算法实验
- 牛客 数据库SQL实战 获取员工其当前的薪水比其manager当前薪水还高的相关信息
- 可穿戴式柔性电子应变传感器基底材料
- 【VUE项目实战】64、CND优化ElementUI以及首页内容定制
热门文章
- 8位深, 16位深,24位深,32位深图片显示原理及对比
- 引用和使用引用传递参数《二》
- ALSA驱动中snd_soc_write()原理分析及demo(二十二)
- Mac解决安装pip(python2.7)失败
- Mac上emacs标记快捷键
- C++线程传递多个参数demo
- 基于Surface的视频编解码与OpenGL ES渲染
- Centos7安装vlc
- tar 整个linux系统,linux下tar解压
- android image 位移动画_ImageView自动来回循环移动,用到Animation