网页数据抓取软件(基于Twisted的异步处理框架,纯python实现的爬虫框架 )
优采云 发布时间: 2022-03-02 20:16网页数据抓取软件(基于Twisted的异步处理框架,纯python实现的爬虫框架
)
Scrapy是一个基于Twisted的异步处理框架,纯python实现的爬虫框架。用户只需要自定义开发几个模块,就可以轻松实现一个爬虫抓取网站数据,提取结构化数据和各种图片,非常方便。Scrapy 常用于数据挖掘、信息处理或存储历史数据等一系列程序中。虽然 Scrapy 最初是为屏幕抓取(更准确地说是网页抓取)而设计的,但它也可以用于访问 API 以提取数据。
如何安装?
打开 网站:
~gohlke/pythonlibs/
在这个python第三方库中下载三个包:lxml、twisted、scrapy。
我下载的是:
lxml-4.3.2-cp37-cp37m-win_amd64.whlScrapy-1.6.0-py2.py3-none-any.whlTwisted-18.9.0-cp37-cp37m-win_amd64.whl
cd到这三个包所在的文件夹,然后pip3依次安装上面三个.whl文件。
例如:
pip3 install lxml-4.3.2-cp37-cp37m-win_amd64.whlpip3 install Twisted-18.9.0-cp37-cp37m-win_amd64.whlpip3 install Scrapy-1.6.0-py2.py3-none-any.whl
全部安装完成后,直接在命令行输入scrapy,看看是否出现如下提示。如果出现,则安装成功。
Scrapy 1.6.0 - no active project
Usage: scrapy [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 -h" to see more info about a command
如果不成功,请从以下网址下载对应的win插件。
221/
架构和流程
Scrapy 使用 Twisted 异步网络库来处理网络通信。整体结构大致如下
Scrapy主要包括以下组件:
用于处理整个系统的数据流,触发事务(框架核心)
它用于接受引擎发送的请求,将其推入队列,并在引擎再次请求时返回。它可以被认为是 URL(被爬取的网站或链接)的优先级队列,它决定了下一个请求。抓取的网址是什么,同时删除重复的网址
用于下载网页内容并将网页内容返回给spider(Scrapy下载器建立在twisted的高效异步模型之上)
爬虫主要用于从特定网页中提取它需要的信息,即所谓的实体(Item)。用户也可以从中提取链接,让 Scrapy 继续爬取下一页
它负责处理爬虫从网页中提取的实体。主要功能是持久化实体,验证实体的有效性,去除不必要的信息。当页面被爬虫解析后,会被发送到项目流水线中,并按照几个特定的顺序对数据进行处理。
Scrapy 引擎和下载器之间的框架主要处理 Scrapy 引擎和下载器之间的请求和响应。
Scrapy引擎和爬虫之间的一个框架,主要工作是处理蜘蛛的响应输入和请求输出。
Scrapy 引擎和调度器之间的中间件,从 Scrapy 引擎发送到调度器的请求和响应。
Scrapy运行过程大致如下:
引擎从调度程序中获取链接(URL)以进行下一次抓取
引擎将 URL 封装为请求发送给下载器
下载器下载资源并封装成响应包(Response)
爬虫解析Response
解析出实体(Item),然后交给实体管道做进一步处理
如果解析的是链接(URL),则将该URL交给调度器等待抓取
如何开始?
制作 Scrapy 爬虫有四个步骤:
新建项目:新建爬虫项目
明确目标(写items.py):指定你要抓取的目标
创建爬虫(spiders/xxspider.py):创建爬虫开始爬网
存储内容(pipelines.py):设计管道来存储爬取的内容
豆瓣阅读频道图书信息爬取
创建项目
scrapy startproject pic
创建爬虫
cd picscrapy genspider book douban.com
自动创建目录和文件
文件描述:
注意:一般在创建爬虫文件时,以网站的域名命名
设置数据存储模板
项目.py
import scrapyclass PicItem(scrapy.Item): addr = scrapy.Field() name = scrapy.Field()
写爬虫
书本.py
# -*- coding: utf-8 -*-import scrapyimport 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'
编写数据处理脚本
管道.py
import urllib.requestimport 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
结果