Python有哪些常見的、好用的爬蟲框架?

想多了解下,好像大多數人用的都是Scrapy,除了Scrapy還有別的爬蟲框架嗎?


又到了和炫酷的造數一起研究爬蟲工具的時候了!

一、什麼是Python爬蟲框架

簡單來說,Python的爬蟲框架就是一些爬蟲項目的半成品。比如我們可以將一些常見爬蟲功能的實現代碼寫好,然後留下一些介面,在做不同的爬蟲項目時,我們只需要根據實際情況,手寫少量需要變動的代碼部分,並按照需要調用這些介面,即可以實現一個爬蟲項目。

二、常見的Python爬蟲框架

1、Scrapy框架

Scrapy框架是一套比較成熟的Python爬蟲框架,是使用Python開發的快速、高層次的信息爬取框架,可以高效的爬取web頁面並提取出結構化數據。

Scrapy應用範圍很廣,爬蟲開發、數據挖掘、數據監測、自動化測試等。

Scrapy官網

官方文檔請參考Scrapy入門教程 - Scrapy 0.24.6 文檔

簡單用法:

scrapy startproject tutorial #創建項目

該命令將會創建包含下列內容的 tutorial 目錄:

tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...

定義Item:

import scrapy

class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()

編寫爬蟲:

import scrapy

class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]

def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, "wb") as f:
f.write(response.body)

運行爬蟲:

scrapy crawl dmoz

2、Crawley框架

Crawley也是Python開發出的爬蟲框架,該框架致力於改變人們從互聯網中提取數據的方式。官網是 Crawley Project · Crawley Project

簡單用法,參考文檔 Crawley』s Documentation

To start a new project run

~$ crawley startproject [project_name]
~$ cd [project_name]

Write your 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))

Write your Scrapers

""" crawlers.py """

from crawley.crawlers import BaseCrawler
from crawley.scrapers import BaseScraper
from crawley.extractors import XPathExtractor
from models import *

class pypiScraper(BaseScraper):

#specify the urls that can be scraped by this class
matching_urls = ["%"]

def scrape(self, response):

#getting the current document"s url.
current_url = response.url
#getting the html table.
table = response.html.xpath("/html/body/div[5]/div/div/div[3]/table")[0]

#for rows 1 to n-1
for tr in table[1:-1]:

#obtaining the searched html inside the rows
td_updated = tr[0]
td_package = tr[1]
package_link = td_package[0]
td_description = tr[2]

#storing data in Packages table
Package(updated=td_updated.text, package=package_link.text, description=td_description.text)

class pypiCrawler(BaseCrawler):

#add your starting urls here
start_urls = ["http://pypi.python.org/pypi"]

#add your scraper classes here
scrapers = [pypiScraper]

#specify you maximum crawling depth level
max_depth = 0

#select your favourite HTML parsing tool
extractor = XPathExtractor

Configure your settings

""" settings.py """

import os
PATH = os.path.dirname(os.path.abspath(__file__))

#Don"t change this if you don"t have renamed the project
PROJECT_NAME = "pypi"
PROJECT_ROOT = os.path.join(PATH, PROJECT_NAME)

DATABASE_ENGINE = "sqlite"
DATABASE_NAME = "pypi"
DATABASE_USER = ""
DATABASE_PASSWORD = ""
DATABASE_HOST = ""
DATABASE_PORT = ""

SHOW_DEBUG_INFO = True

Finally, just run the crawler

~$ crawley run

3、Portia框架

Portia框架是一款允許沒有任何編程基礎的用戶可視化地爬取網頁的爬蟲框架,GitHub: scrapinghub/portia

可以直接使用網頁版的Portia框架,地址 Login · Scrapinghub

相關信息填寫好後,單擊「Create Project」,就可以爬取網站了

通過可視化界面,很方便配置爬蟲。

4、newspaper框架

newspaper框架是一個用來提取新聞、文章以及內容分析的Python爬蟲框架,GitHub: codelucas/newspaper

簡單用法:

&>&>&> from newspaper import Article
&>&>&> url = "http://news.163.com/17/0525/08/CL95029O0001875P.html"
&>&>&> a = Article(url, language="zh")
&>&>&> a.download()
&>&>&> a.parse()
Building prefix dict from C:Python35libsite-packagesjiebadict.txt ...
Dumping model to file cache C:UsersADMINI~1AppDataLocalTempjieba.cache
Loading model cost 1.6619999408721924 seconds.
Prefix dict has been built succesfully.
&>&>&> print(a.title)
主播直播上山采蘑菇遇腐屍 1000多網友在線觀看
&>&>&> print(a.text)
(原標題:震驚!主播直播上山采蘑菇突遇腐爛屍體 1000多網友在線觀看)

南都訊 記者彭彬 5月23日下午四點半左右,直播平台主播吳權彼在直播上山采蘑菇時,意外發現一
具腐爛多日、發黑髮紫的屍體,吳權彼當即中斷直播報警,1000多在線網友觀看了這驚魂一幕。隨後
,警方到達現場,目前案件仍在進一步調查之中。
"""

5、Python-goose框架

Python-goose框架可提取的信息包括:

  • 文章主體內容
  • 文章主要圖片
  • 文章中嵌入的任何Youtube/Vimeo視頻
  • 元描述
  • 元標籤

GitHub: grangier/python-goose

簡單用法:

&>&>&> from goose import Goose
&>&>&> from goose.text import StopWordsChinese
&>&>&> url = "http://www.bbc.co.uk/zhongwen/simp/chinese_news/2012/12/121210_hongkong_politics.shtml"
&>&>&> g = Goose({"stopwords_class": StopWordsChinese})
&>&>&> article = g.extract(url=url)
&>&>&> print article.cleaned_text[:150]
香港行政長官梁振英在各方壓力下就其大宅的違章建築(僭建)問題到立法會接受質詢,並向香港民眾道歉。

梁振英在星期二(12月10日)的答問大會開始之際在其演說中道歉,但強調他在違章建築問題上沒有隱瞞的意圖和動機。

一些親北京陣營議員歡迎梁振英道歉,且認為應能獲得香港民眾接受,但這些議員也質問梁振英有

當然還有更多, @笑虎 介紹的 PSpider 一個極為簡潔的Python爬蟲框架 , @花開不敗 介紹的 PySpider Pyspider框架 -- Python爬蟲實戰之爬取 V2EX 網站帖子 ,都是非常好用的。

三、總結

在Python中,開源爬蟲框架很多,我們自己也可以寫一些。我們並不需要掌握每一種爬蟲框架,只需要深入掌握一種即可。大部分爬蟲框架實現方式都是大同小異,建議學習最流行的Python爬蟲框架——Scrapy。


更多精彩關註:

造數 - 風裡雨里造數等著你!


pyspider
不過自己用就寫腳本,鍛煉一下,多學一點兒


requests + beautifulsoup4 + lxml 完美組合


你想自己寫一個還是想爬蟲。
1想爬蟲就先自己寫,再去找框架用。
2想寫一個爬蟲框架,就先1,然後再開發框架。


推薦閱讀:

如何去尋找網路爬蟲的需求?
Python實現爬蟲代理池?
python分享中初級爬蟲教程泛濫是否有其語法特徵和生態環境的鍋?
python爬蟲如何按序抓取一個頁面上的圖文?
如何用爬蟲下載中國土地市場網的土地成交數據?

TAG:Python | 爬蟲計算機網路 | Python框架 | 網頁爬蟲 |