8个最高效的Python爬虫框架

一般比较小型的爬虫需求,我是直接使用requests库 + bs4就解决了,再麻烦点的就使用selenium解决js的异步加载问题。Python爬虫框架只有在遇到比较大型的需求时会用到,主要是为了方便管理以及扩展。

下面收集整理了一些高效的爬虫框架,个人觉得其中比较好用的是Scrapy和PySpider,这两个相对来说用的更多,大家根据自己的使用习惯和喜好来就行。

1、Scrapy

是用纯 Python 实现一个为了爬取网站数据、提取结构性数据而编写的应用框架, 用途非常广泛。

可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

8个最高效的Python爬虫框架

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异步网络库来处理网络通讯,可以加快下载的速度,不用自己去实现异步框架。

整体架构大致如下:

8个最高效的Python爬虫框架

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爬虫 新手学习教程>

8个最高效的Python爬虫框架

2、PySpider

PySpider是binux做的一个爬虫架构的开源化实现,强大的网络爬虫系统,并自带有强大的webUI,分布式架构,支持多种数据库后端。

框架特性:

  • python 脚本控制,可以用任何你喜欢的html解析包(内置 pyquery)
  • WEB 界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出
  • 支持 MySQL, MongoDB, SQLite
  • 支持抓取 JavaScript 的页面
  • 组件可替换,支持单机/分布式部署,支持 Docker 部署
  • 强大的调度控制
8个最高效的Python爬虫框架

打开cmd,输入pyspider,然后打开浏览器输入:http://localhost:5000,就可以进入pyspider的后台了。

8个最高效的Python爬虫框架

第一次打开后台是一片空白的,点开浏览器后cmd不要关了,点击Create,随便输入一个名字(当然名字还是不要乱取)。

8个最高效的Python爬虫框架

点击确定之后就进入一个脚本编辑器了;

8个最高效的Python爬虫框架

数据处理流程:

各个组件间使用消息队列连接,除了scheduler是单点的,fetcher 和 processor 都是可以多实例分布式部署的。scheduler 负责整体的调度控制

任务由 scheduler 发起调度,fetcher 抓取网页内容, processor 执行预先编写的python脚本,输出结果或产生新的提链任务(发往 scheduler),形成闭环。

每个脚本可以灵活使用各种python库对页面进行解析,使用框架API控制下一步抓取动作,通过设置回调控制解析动作。

8个最高效的Python爬虫框架
框架构造图

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爬虫框架学习资源 点击获取>

8个最高效的Python爬虫框架

3、Portia

是一个开源可视化爬虫工具,可以让使用者在不需要任何编程知识的情况下爬取网站。简单地注释自己感兴趣的页面,Portia将创建一个蜘蛛来从类似的页面提取数据。

需要注意的是:

Portia 只是一个可视化编辑爬取规则编辑器,最终创建出来的是一个 scrapy 爬虫项目。如果想要对爬虫进行部署、管理,还是需要学习 scrapy 相关知识。

只能爬取扁平化、结构单一的网站,对于爬取层次较深的网站比较难编写爬取规则。

8个最高效的Python爬虫框架

建议使用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

8个最高效的Python爬虫框架

Extracts data

8个最高效的Python爬虫框架

可以在右侧看到当前页面所有提取的数据;

运行爬虫:

1)Portia 提供导出为 Scrapy 的功能,导出以后,可以使用Scrapy来运行爬虫。

8个最高效的Python爬虫框架

2)可以使用 Portia 的命令 portiacrawl project_path spider_name -o output.json来运行。

3)在 ScrapingHub 点击运行,可以在 web 页面上可视化的查看结果,导出数据。

8个最高效的Python爬虫框架

部署Portia 只能可视化的创建一个 scrapy 爬虫,并不能在网页可视化的部署运行。如果需要 web 端可视化管理爬虫有两种方法。

  • 需要 Scrapinghub 的 Scrapy Cloud,深度使用需要收费
  • 使用 scrapyd 和 scrapyd-client 来部署和管理 scrapy 爬虫

4、Beautiful Soup

这个是大家都很熟悉的了,整合了一些常用爬虫需求。

它是一个可以从HTML或XML文件中提取数据的Python库,能够通过你喜欢的转换器实现惯用的文档导航,查找、修改文档的方式。

8个最高效的Python爬虫框架

Beautiful Soup的缺点是不能加载JS;

8个最高效的Python爬虫框架

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等。

8个最高效的Python爬虫框架

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界面的测试。

8个最高效的Python爬虫框架

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框架;

8个最高效的Python爬虫框架

借助Grab,可以构建各种复杂的网页抓取工具,从简单的5行脚本到处理数百万个网页的复杂异步网站抓取工具,Grab提供一个API用于执行网络请求和处理接收到的内容,例如与HTML文档的DOM树进行交互。

以上这些框架的优缺点都不同,大家在使用的时候,可以根据具体场景选择合适的框架。

案例对比 Requests、Selenium、Scrapy 谁是yyds?-腾讯云开发者社区-腾讯云 (tencent.com)

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/313367.html

(0)
上一篇 2024年5月14日
下一篇 2024年5月15日

发表回复

登录后才能评论