1. 程式人生 > >爬蟲學習之基於Scrapy的網路爬蟲

爬蟲學習之基於Scrapy的網路爬蟲

在上一篇文章《爬蟲學習之一個簡單的網路爬蟲》中我們對爬蟲的概念有了一個初步的認識,並且通過Python的一些第三方庫很方便的提取了我們想要的內容,但是通常面對工作當作複雜的需求,如果都按照那樣的方式來處理效率非常的低,這通常需要你自己去定義並實現很多非常基礎的爬蟲框架上的功能,或者需要組合很多Python第三方庫來做。不過不用擔心,Python中有很多非常優秀的爬蟲框架,比如我們接下來要學習到的Scrapy。Scrapy官方有很經典的入門文件說明,這一篇僅僅是通過一個簡單的例項來了解Scrapy這個庫是如何來進行網路內容提取的,更深入的學習請閱讀Scrapy官方文件

建立目標

同樣在做任何事情之前都需要明確目標,那這次我們的目標是爬取一些技術性的文章並存儲到資料庫中。這就需要有目標網址和資料庫結構,資料庫我們選擇使用MySql,目標網站我們找了一個叫指令碼之家的內容站。我們這裡首先準備好一張用於儲存文章的表結構:

123456789101112 CREATE TABLE`articles`(`id`mediumint(8)AUTO_INCREMENT NOTNULL,`title`varchar(255)DEFAULTNULL,`content`longtext,`add_date`int(11)DEFAULT0,`hits`int(11)DEFAULT'0',`origin`varchar(500)DEFAULT'',`tags`varchar(45)DEFAULT'',PRIMARY KEY(`id`),KEY`add_date
`(`add_date`))ENGINE=InnoDB DEFAULTCHARSET=utf8 COLLATE=utf8_unicode_ci;

分析目標結構
這裡我們首先需要爬取得入口是“網路程式設計”這個節點,主入口網址為(http://www.jb51.net/list/index_1.htm) 開啟這個網站我們通過Chrome或者其他瀏覽器的檢視元素來分析當前頁面的HTML語義結構,如下圖所示:

從圖中紅色框線的部分可以看出,這裡是我們需要在“網路程式設計”這個節點下需要提取的所有文章的主分類入口,通過這些入口可以進去到不同文章分類的列表中。所以根據初步結構分析,我們得出本次爬蟲的爬取路線為:

從主入口進去 -> 提取當前入口中的所有分類 -> 通過分類入口進入到分類列表 -> 通過列表進入到文章頁

分類入口確定了接下來看看我們的分類列表,隨意點開一個分類入口,開啟列表如下圖所示:

這裡我框出了兩個主要部分,第一個是文章的標題,第二個是分頁,文章對應的URL就是我們接下來需要爬取文章內容的入口,這裡需要注意的是分頁的處理,通過分頁的最後一頁我們可以知道當前這類列表共有多少頁文章。結合以上分析我們基本確定了本次爬蟲的各個路線入口,接下來我們就開始通過程式來實現本次的目標。

實現爬蟲

在實現爬蟲之前我們通過一張圖來對Scrapy有個基本的認識,為了保持本章內容的簡潔性,我們這裡暫時不會討論Item Pipeline部分,Scrapy架構圖如下所示(圖片來自網路):

從圖中可以很清晰的看到Scrapy所包含的幾大塊,下面我們通過程式碼來演示我們所用到的基礎功能部分。
主要依賴第三方庫:

web.py web框架,這裡只用到了database部分,將來會用來進行內容展示
scrapy 爬蟲框架,這裡只用到了最基本的內容提取

這裡還會用到一些xpath相關知識,請自行Google瞭解xpath語法

Python
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 # -*- coding:utf-8 -*-'''by sudo rm -rf  http://imchenkun.com'''importscrapyfromscrapy.http importRequestimportwebimporttimedb=web.database(dbn='mysql',host='127.0.0.1',db='imchenkun',user='root',pw='root')# 允許的站點域allow_domain="jb51.net"base_url="http://www.jb51.net"# 列表頁list_url="http://www.jb51.net/list/list_%d_%d.htm"# 列表分頁list_page=1# 文章頁crawl_url="http://www.jb51.net/article/%d.htm"classJB51Spider(scrapy.Spider):name="jb51"start_urls=["http://www.jb51.net/list/index_1.htm"]cate_list=[]defparse(self,response):cate_id=response.selector.xpath('//div[@class="index_bor clearfix"]/div[@class="index_con"]/span/a/@href').re('(\\\\d+)')[::2]foridincate_id:cate_url=list_url%(int(id),1)yieldRequest(cate_url,callback=self.parse_page)defparse_page(self,response):_params=response.selector.xpath('//div[@class="dxypage clearfix"]/a[last()]/@href').re('(\\\\d+)')cate_id=int(_params[0])# 分類編號count=int(_params[1])# 總頁數article_urls=response.selector.xpath('//div[@class="artlist clearfix"]/dl/dt/a/@href').extract()# 處理第一頁forarticle_url inarticle_urls:yieldRequest(base_url+article_url,callback=self.parse_article)# 處理其他頁forpage inrange(1,count):url=(list_url%(cate_id,page+1))yieldRequest(url,callback=self.parse_list)defparse_list(self,response):"""解析文章列表"""article_urls=response.selector.xpath('//div[@class="artlist clearfix"]/dl/dt/a/@href').extract()forarticle_url inarticle_urls:yieldRequest(base_url+article_url,callback=self.parse_article)defparse_article(self,response):"""解析文章內容"""title=response.selector.xpath('//div[@class="title"]/h1/text()').extract()[0]content=response.selector.xpath('//div[@id="content"]').extract()[0]tags=','.join(response.selector.xpath('//div[@class="tags mt10"]/a/text()').extract())results=db.query('select count(0) as total from articles where origin=$origin',vars={'origin':response.url})ifresults[0].total<=0:db.insert('articles',title=title,origin=response.url,content=content,add_date=int(time.time()),hits=0,tags=tags)

安裝Scrapy後以上程式碼通過以下命令執行:

scrapy runspider jb51_spider.py

本次執行後的效果在資料庫中可以見如下圖所示:

總結

本篇文章我們主要了解了基本的Scrapy Spider部分,而且通過對目標網站的結構分析使用xpath進行內容的提取,以及分頁的處理。這裡我們的目的是建立一種寫爬蟲的思路,而不在於怎麼使用工具來爬資料。首先確定目標,然後分析目標,再借助現有工具進行內容提取,提取內容的過程中會遇到各種問題,這個時候我們再來逐個解決這些問題,直到我們的爬蟲能夠無障礙的執行。接下來我會使用Scrapy更多的功能將繼續探索Item的定義,Pipeline的實現以及如何使用代理。

特別申明:本文所提到的指令碼之家網站只是拿來進行爬蟲的技術交流學習,讀者涉及到的所有侵權問題都與本人無關,也希望大家在學習實戰的過程中不要大量的爬取內容對伺服器造成負擔

相關推薦

爬蟲學習基於 Scrapy爬蟲自動登入

概述 在前面兩篇(爬蟲學習之基於Scrapy的網路爬蟲和爬蟲學習之簡單的網路爬蟲)文章中我們通過兩個實際的案例,採用不同的方式進行了內容提取。我們對網路爬蟲有了一個比較初級的認識,只要發起請求獲取響應的網頁內容,然後對內容進行格式化儲存。很多時候我們抓取到的內容可能會發生重複,

爬蟲學習基於Scrapy網路爬蟲

在上一篇文章《爬蟲學習之一個簡單的網路爬蟲》中我們對爬蟲的概念有了一個初步的認識,並且通過Python的一些第三方庫很方便的提取了我們想要的內容,但是通常面對工作當作複雜的需求,如果都按照那樣的方式來處理效率非常的低,這通常需要你自己去定義並實現很多非常基礎的爬蟲框架上的功能,或者需要組合很多Python第

如何學習爬蟲,我的爬蟲學習路,怎樣學好爬蟲的,爬蟲認知篇(1)

          作為一個小白來說,那就是---->我,看那多原理,等於天書,我看不懂,但是為啥是叫了解爬蟲,而不是懂裡邊內容,框架(Scrapy)怎麼寫的,我作為小白知道怎麼用,不就行了嗎,對不對,之後在瞭解深入.

python3 + Scrapy爬蟲學習創建項目

set 切換 存儲 域名 arm () 打開文件 ofo 實戰 最近準備做一個關於scrapy框架的實戰,爬取騰訊社招信息並存儲,這篇博客記錄一下創建項目的步驟 pycharm是無法創建一個scrapy項目的 因此,我們需要用命令行的方法新建一個scrapy項目 請確保已經

python爬蟲學習路-遇錯筆記-1

sig packages ror caused 技術 bsp img exception mage 當在編寫爬蟲時同時開啟了Fidder解析工具時,訪問目標站點會遇到以下錯誤: File "C:\Users\litao\AppData\Local\Programs\P

爬蟲學習-xpath

path aid ebr ast 函數文本 通過 passport attr sel 1、XPATH使用方法 使用XPATH有如下幾種方法定位元素(相比CSS選擇器,方法稍微多一點): a、通過絕對路徑定位元素(不推薦!) WebElement ele = driver

爬蟲學習-python插入mysql報錯

語句 mysql報錯 cal character 通過 tle port utf nco 異常:‘latin-1‘ codec can‘t encode characters in position 62-66: ordinal not in range(256) 用P

爬蟲學習-返回合法文件名

turn python 爬蟲學習 urn ida file 返回 pan 文件名 def validateTitle(title): rstr = r"[\/\\\:\*\?\"\<\>\|]" # ‘/ \ : * ? " < > |‘

爬蟲學習-文件管道重寫

.org url The brush 學習 zoom 保存 raw files 如果要文件管道保存為原有的文件名 需要重寫文件管道的方法 pipeitem文件 # -*- coding: utf-8 -*- # Define your item pipelines

urllib庫的學習總結(python3網路爬蟲開發實戰專案)

urllib庫是python內建的HTTP請求庫,包含以下四個模組: request:最基本的HTTP請求模組,可以用來模擬傳送請求。只需要給庫方法傳入URL以及額外的引數,就可以模擬實現這個過程了。 error:異常處理模組,如果出現請求錯誤,我們可以捕獲這些異常,然後進行重試或其

python Scrapy網路爬蟲實戰(存Json檔案以及存到mysql資料庫)

1-Scrapy建立新工程 在開始爬取之前,您必須建立一個新的 Scrapy 專案。 進入您打算儲存程式碼的目錄中【工作目錄】,執行下列命令,如下是我建立的一個爬取豆瓣的工程douban【儲存路徑為:C:\python27\web】:  命令: scrapy star

python爬蟲學習爬取全國各省市縣級城市郵政編碼

例項需求:運用python語言在http://www.ip138.com/post/網站爬取全國各個省市縣級城市的郵政編碼,並且儲存在excel檔案中 例項環境:python3.7       requests庫(內建的python庫,無需手動安裝)       xlwt庫(需要自己手動安裝) 例項網站:

scrapy(網路爬蟲)———CrawlSpider(規則爬蟲

CrawlSpider(規則爬蟲) 一 .簡介:它是Spider的派生類,Spider類的設計原則是隻爬取start_url列表中的網頁,而CrawlSpider類定義了一些規則(rule)來提供跟進link的方便的機制,從爬取的網頁中獲取link並繼續爬取的工作更適合。 二.建立爬

Python極簡教程八:網路爬蟲入門

讀取網頁 下載後使用gbk解碼。 import urllib2 url = 'http://www.domain.com/domestic' # download resp = urllib2.urlopen(url).read() # decode resp = resp.dec

Python爬蟲學習正則表達式爬取個人博客

9.png turn () htm parent ast string 則表達式 urn 實例需求:運用python語言爬取http://www.eastmountyxz.com/個人博客的基本信息,包括網頁標題,網頁所有圖片的url,網頁文章的url、標題以及摘要。 實

【Python3 爬蟲學習筆記】Scrapy框架的使用 1

Scrapy功能非常強大,爬取效率高,相關擴充套件元件多,可配置和可擴充套件程度非常高,它幾乎可以應對所有發爬網站,是目前Python中使用最廣泛的爬蟲框架。 Scrapy框架介紹 Scrapy是一個基於Twisted的非同步處理框架,是純Python實現的爬蟲

python爬蟲學習正則表示式的基本使用

一、正則表示式   1. 正則表示式是字串處理的有力工具和技術。  2. 正則表示式使用某種預定義的模式去匹配一類具有共同特徵的字串,主要用於處理字串,可以快速、準確地完成複雜的查詢、替換等處理要求,在文字編輯與處理、網頁爬蟲之類的場合中有重要應用。  3. Python中,re模組提供了正則表示式操作所需

python爬蟲學習日誌記錄模組

這次的程式碼就是一個日誌記錄模組,程式碼很容易懂,註釋很詳細,也不需要安裝什麼庫。提供的功能是日誌可以顯示在螢幕上並且儲存在日誌檔案中。呼叫的方式也很簡單,測試程式碼裡面有。 原始碼: #encoding=utf-8 import logging import getpass import

python爬蟲學習 定向爬取 股票資訊

一、功能描述 目標:獲取上交所和深交所所有股票的名稱和交易 資訊 輸出:儲存到檔案中 技術路線:requests-bs4-re 二、 選取原則:股票資訊靜態存在於HTML頁面中,非js程式碼生成,沒有robots協議限制 三、程式的結構設計

網頁爬蟲學習獲取網頁中標籤內容

(1)本地網頁,通過網頁中的元素進行篩選想要獲取的內容 web_parseDemo01.py from bs4 import BeautifulSoup#1、解析網頁內容,網頁的構成with open('C:/Users/GXY/PycharmProjects/untitled/homework.html