一般比较小型的爬虫需求,我是直接使用requests库 + bs4就解决了,再麻烦点的就使用selenium解决js的异步加载问题。Python爬虫框架只有在遇到比较大型的需求时会用到,主要是为了方便管理以及扩展。
下面收集整理了一些高效的爬虫框架,个人觉得其中比较好用的是Scrapy和PySpider,这两个相对来说用的更多,大家根据自己的使用习惯和喜好来就行。
1、Scrapy
是用纯 Python 实现一个为了爬取网站数据、提取结构性数据而编写的应用框架, 用途非常广泛。
可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
Scrapy可以很方便的进行web抓取,并且可以很方便的根据自己的需求进行定制。
安装
pip install scrapy
在开始爬取之前,必须创建一个新的Scrapy项目,需要注意的是:创建项目时,会在当前目录下新建爬虫项目的目录。
scrapy startproject tutorial
ls
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
文件说明:
- scrapy.cfg:项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
- items.py:设置数据存储模板,用于结构化数据,如:Django的Model
- pipelines:数据处理行为,如:一般结构化的数据持久化
- settings.py:配置文件,如:递归的层数、并发数,延迟下载等
- spiders:爬虫目录,如:创建文件,编写爬虫规则
Scrapy 使用了 Twisted异步网络库来处理网络通讯,可以加快下载的速度,不用自己去实现异步框架。
整体架构大致如下:
Scrapy运行流程大概如下:
- 引擎从调度器中取出一个链接(URL)用于接下来的抓取
- 引擎把URL封装成一个请求(Request)传给下载器
- 下载器把资源下载下来,并封装成应答包(Response)
- 爬虫解析Response
- 解析出实体(Item),则交给实体管道进行进一步的处理
- 解析出的是链接(URL),则把URL交给调度器等待抓取
补充小点:安装Scrapy可能会遇到的问题
① ImportError: No module named w3lib.http
解决:pip install w3lib
② ImportError: No module named twisted
解决:pip install twisted
③ ImportError: No module named lxml.HTML
解决:pip install lxml
④ error: libxml/xmlversion.h: No such file or directory
解决:apt-get install libxml2-dev libxslt-dev
apt-get install Python-lxml
⑤ ImportError: No module named cssselect
解决:pip install cssselect
⑥ ImportError: No module named OpenSSL
解决:pip install pyOpenSSL
或者直接简单的办法:使用anaconda安装;
Scrapy这个框架使用频率很高,在相关岗位的招聘要求中这是必须要会熟练掌握的一款主流框架,Python新手小白在学习爬虫的时候,可以着重练习一下这个框架的使用。
下方也分享了一套Python爬虫的学习教程,需要的可下方自提↓↓
<Python爬虫 新手学习教程>
2、PySpider
PySpider是binux做的一个爬虫架构的开源化实现,强大的网络爬虫系统,并自带有强大的webUI,分布式架构,支持多种数据库后端。
框架特性:
- python 脚本控制,可以用任何你喜欢的html解析包(内置 pyquery)
- WEB 界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出
- 支持 MySQL, MongoDB, SQLite
- 支持抓取 JavaScript 的页面
- 组件可替换,支持单机/分布式部署,支持 Docker 部署
- 强大的调度控制
打开cmd,输入pyspider,然后打开浏览器输入:http://localhost:5000,就可以进入pyspider的后台了。
第一次打开后台是一片空白的,点开浏览器后cmd不要关了,点击Create,随便输入一个名字(当然名字还是不要乱取)。
点击确定之后就进入一个脚本编辑器了;
数据处理流程:
各个组件间使用消息队列连接,除了scheduler是单点的,fetcher 和 processor 都是可以多实例分布式部署的。scheduler 负责整体的调度控制
任务由 scheduler 发起调度,fetcher 抓取网页内容, processor 执行预先编写的python脚本,输出结果或产生新的提链任务(发往 scheduler),形成闭环。
每个脚本可以灵活使用各种python库对页面进行解析,使用框架API控制下一步抓取动作,通过设置回调控制解析动作。
PySpider基本使用:
from libs.base_handler import *
class Handler(BaseHandler):
@every(minutes=24*60, seconds=0)
def on_start(self):
self.crawl('A Fast and Powerful Scraping and Web Crawling Framework', callback=self.index_page)
# @every:告诉调度器 on_start方法每天执行一次。
# on_start:作为爬虫入口代码,调用此函数,启动抓取。
@config(age=10*24*60*60)
def index_page(self, response):
for each in response.doc('a[href^="http://"]').items():
self.crawl(each.attr.href, callback=self.detail_page)
# @config:告诉调度器 request请求的过期时间是10天,10天内再遇到这个请求直接忽略。此参数亦可在self.crawl(url, age=10*24*60*60)中设置。
# index_page:获取一个Response对象,response.doc是pyquery对象的一个扩展方法。
def detail_page(self, response):
return {
"url": response.url,
"title": response.doc('title').text(),
}
# detail_page:返回一个结果集对象。这个结果默认会被添加到resultdb数据库(如果启动时没有指定数据库默认调用sqlite数据库)。
pyspider上手更简单,操作更加简便,因为它增加了 WEB 界面,写爬虫迅速,集成了phantomjs,可以用来抓取js渲染的页面。
Scrapy自定义程度高,比 PySpider更底层一些,适合学习研究,需要学习的相关知识多。
这里我把自己用过的一些Python爬虫学习资料整理在下方了,有需要的可点击下方进群找群管理获取↓↓↓【无偿分享】
<小白Python爬虫框架学习资源 点击获取>
3、Portia
是一个开源可视化爬虫工具,可以让使用者在不需要任何编程知识的情况下爬取网站。简单地注释自己感兴趣的页面,Portia将创建一个蜘蛛来从类似的页面提取数据。
需要注意的是:
Portia 只是一个可视化编辑爬取规则编辑器,最终创建出来的是一个 scrapy 爬虫项目。如果想要对爬虫进行部署、管理,还是需要学习 scrapy 相关知识。
只能爬取扁平化、结构单一的网站,对于爬取层次较深的网站比较难编写爬取规则。
建议使用docker安装,Docker 在 Windows 上部署比较麻烦,推荐在 Linux 环境下部署 Portia。
docker pull starjason/portia
运行
docker run -i -t --rm -v <PROJECTS_FOLDER>:/app/data/projects:rw -p 9001:9001 scrapinghub/portia
爬取数据的工作流程主要分为两步
Follow Links
Extracts data
可以在右侧看到当前页面所有提取的数据;
运行爬虫:
1)Portia 提供导出为 Scrapy 的功能,导出以后,可以使用Scrapy来运行爬虫。
2)可以使用 Portia 的命令 portiacrawl project_path spider_name -o output.json来运行。
3)在 ScrapingHub 点击运行,可以在 web 页面上可视化的查看结果,导出数据。
部署Portia 只能可视化的创建一个 scrapy 爬虫,并不能在网页可视化的部署运行。如果需要 web 端可视化管理爬虫有两种方法。
- 需要 Scrapinghub 的 Scrapy Cloud,深度使用需要收费
- 使用 scrapyd 和 scrapyd-client 来部署和管理 scrapy 爬虫
4、Beautiful Soup
这个是大家都很熟悉的了,整合了一些常用爬虫需求。
它是一个可以从HTML或XML文件中提取数据的Python库,能够通过你喜欢的转换器实现惯用的文档导航,查找、修改文档的方式。
Beautiful Soup的缺点是不能加载JS;
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象。
所有对象可以归纳为4种:
(1)Tag:通俗点讲就是 HTML 中的一个个标签,像上面的 div,p。每个 Tag 有两个重要的属性 name 和 attrs,name 指标签的名字或者 tag 本身的 name,attrs 通常指一个标签的 class。
(2)NavigableString:获取标签内部的文字,如,soup.p.string。
(3)BeautifulSoup:表示一个文档的全部内容。
(4)Comment:Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。
代码示例:
# -*- coding: UTF-8 -*-
from bs4 import BeautifulSoup
import requests
import time
url = "https://blog.csdn.net/"
# 创建一个列表,来装我们的a标签的所有内容
alists = []
html_str = requests.get(url)
#接下来就把我们获取到的html内容放到我们BeautifulSoup这个方法中,通这个方法得到一个对象,在这个对象里BeautifulSoup帮我们把整个html变成了各个节点,我们就可以利用框架快速查找到我们需要的标签。
soup = BeautifulSoup(html_str.text, 'html.parser')
#find_all 通过这个方法寻找a标签
all_a = soup.find_all('a')
#循环将a标签放到我们的列表里面
for item in all_a:
if item:
if len(item) > 2:
alists.append(item)
#循环输出列表,打印我们刚刚得到的数据
for a in alists:
#replace 这个方法是字符串处理的一种方法,我们去掉nt这样的话我们就可以看到不换行的结果了
print(str(a).replace("n",""))
pass
print("当前时间: ",time.strftime('%Y.%m.%d %H:%M:%S ',time.localtime(time.time())))
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。
这个我是使用的特别频繁的,在获取html元素,都是bs4完成的。
5、Crawley
Crawley可以高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。
crawley框架的主要特点:
(1)简单易学,能高速爬取对应网站内容
(2)可将爬取到内容轻松存到数据库中,比如:postgres,mysql,oracle,sqlite等数据库
(3)可以将爬取到的数据导出为json,xml等格式
(4)支持非关系型数据库,比如:mongodb,couchdb等
(5)支持使用命令行工具
(6)可以使用你喜欢的工具提取数据,比如使用xpath或者pyquery等工具
(7)支持使用cookie登陆并访问哪些只有登陆才能够访问的网页
创建project
~$ crawley startproject [project_name]
~$ cd [project_name]
定义models
""" models.py """
from crawley.persistance import Entity, UrlEntity, Field, Unicode
class Package(Entity):
#add your table fields here
updated = Field(Unicode(255))
package = Field(Unicode(255))
description = Field(Unicode(255))
6、selenium
这是一个调用浏览器的driver,通过这个库可以直接调用浏览器完成某些操作,比如输入验证码。
Selenium是自动化测试工具,支持各种浏览器,包括 Chrome,Safari,Firefox等主流界面式浏览器,如果在这些浏览器里面安装一个 Selenium 的插件,可方便地实现Web界面的测试。
Selenium支持浏览器驱动,PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与Python的对接,Python进行后期的处理。
示例:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('http://www.yahoo.com')
assert 'Yahoo' in browser.title
elem = browser.find_element_by_name('p') # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN)
browser.quit()
7、Python-goose
Python-goose框架可提取的信息包括:
- 文章主体内容
- 文章主要图片
- 文章中嵌入的任何Youtube/Vimeo视频
- 元描述
- 元标签
示例
>>> from goose import Goose
>>> url = 'Occupy London loses eviction fight'
>>> g = Goose()
>>> article = g.extract(url=url)
>>> article.title
u'Occupy London loses eviction fight'
>>> article.meta_description
"Occupy London protesters who have been camped outside the landmark St. Paul's Cathedral for the past four months lost their court bid to avoid eviction Wednesday in a decision made by London's Court of Appeal."
>>> article.cleaned_text[:150]
(CNN) -- Occupy London protesters who have been camped outside the landmark St. Paul's Cathedral for the past four months lost their court bid to avoi
>>> article.top_image.src
http://i2.cdn.turner.com/cnn/dam/assets/111017024308-occupy-london-st-paul-s-cathedral-story-top.jpg
8、Grab
是一个用于构建Web刮板的Python框架;
借助Grab,可以构建各种复杂的网页抓取工具,从简单的5行脚本到处理数百万个网页的复杂异步网站抓取工具,Grab提供一个API用于执行网络请求和处理接收到的内容,例如与HTML文档的DOM树进行交互。
以上这些框架的优缺点都不同,大家在使用的时候,可以根据具体场景选择合适的框架。
案例对比 Requests、Selenium、Scrapy 谁是yyds?-腾讯云开发者社区-腾讯云 (tencent.com)
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/313367.html