Python3 大型網路爬蟲實戰 002 --- scrapy 爬蟲專案的建立及爬蟲的建立 --- 例項:爬取百度標題和CSDN部落格

AoboSir發表於2016-11-26

開發環境

  • Python第三方庫:lxml、Twisted、pywin32、scrapy
  • Python 版本:python-3.5.0-amd64
  • PyCharm軟體版本:pycharm-professional-2016.1.4
  • 電腦系統:Windows 10 64位

如果你還沒有搭建好開發環境,請到這篇部落格


1 知識點:scrapy 爬蟲專案的建立及爬蟲的建立

1.1 scrapy 爬蟲專案的建立

接下來我們為大家建立一個Scrapy爬蟲專案,並在爬蟲專案下建立一個Scrapy爬蟲檔案。

scrapy startproject <projectname> 

1.2 scrapy 爬蟲檔案的建立

cd demo
scrapy genspider -t basic <filename> <domain>

更多 Scrapy 命令的介紹請到這篇部落格檢視。


2 例項:爬取百度標題和CSDN部落格

我們建立一個爬蟲專案,在裡面建立一個爬蟲檔案來爬取百度,並再建立一個爬蟲檔案爬取CSDN部落格文章。


先建立一個Scrapy爬蟲專案:

scrapy startproject firstDemo

輸出:

D:\WorkSpace\python_ws\python-large-web-crawler>scrapy startproject firstdemo
New Scrapy project 'firstdemo', using template directory 'c:\\users\\aobo\\appdata\\local\\programs\\python\\python35\\lib\\site-packages\\scrapy\\templates\\project', created in:
    D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo

You can start your first spider with:
    cd firstdemo
    scrapy genspider example example.com

D:\WorkSpace\python_ws\python-large-web-crawler>

2-1.1 使用Scrapy爬蟲 爬取百度標題

建立一個爬蟲檔案來爬取百度

cd firstDemo
scrapy genspider -t basic baidu baidu.com

輸出:

D:\WorkSpace\python_ws\python-large-web-crawler>cd firstdemo

D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo>scrapy genspider -t basic baidu baidu.com
Created spider 'baidu' using template 'basic' in module:
  firstdemo.spiders.baidu

D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo>

Alt text

開啟 PyCharm 軟體,用 PyCharm 軟體開啟剛剛建立的 firstdemo 爬蟲專案。

Alt text

Alt text

開啟這 baidu.py 爬蟲檔案,你會看到自動生成的程式碼:

Alt text

2-1.2 觀察 https://www.baidu.com/ 網頁原始碼

(原始碼太多,列出重點的。)

<html xmlns="http://www.w3.org/1999/xhtml" class="cye-enabled cye-nm sui-componentWrap">
    <head>
        <title>百度一下,你就知道 </title>
    </head>
</html>

原始碼中的標題通過標籤逐步定位: /html/head/title

2-1.3 寫程式碼

我們現在要提取出 https://www.baidu.com/ 網頁 的標題:百度一下,你就知道

提取資訊,一般使用 xpath 或者 正規表示式 來提取。

這裡我們使用 xpath 來提取,xpath 的知識點,請到這篇部落格中檢視。


下面的編寫程式碼的步驟:

Step 1 . 設定我們的爬蟲不遵循 robots.txt 規定。(什麼是robots.txt規定,請到這個部落格檢視。)

開啟 settings.py 檔案,將裡面的ROBOTSTXT_OBEY 設為:False

Alt text

Step 2 . 開啟 items.py 檔案,在裡面FirstdemoItem()函式裡新增一項:

    title = scrapy.Field()

Alt text

Step 3 . baidu.py 檔案裡面,使用xpath 表示式 提取百度網頁的標題。

先從核心目錄(firstdemo)定位到items.py 檔案裡面的FirstdemoItem函式。

然後使用xpath 表示式 提取百度網頁的標題。

最後,返回。

# -*- coding: utf-8 -*-
import scrapy
from firstdemo.items import FirstdemoItem

class BaiduSpider(scrapy.Spider):
    name = "baidu"
    allowed_domains = ["baidu.com"]
    start_urls = ['http://baidu.com/']

    def parse(self, response):
        item = FirstdemoItem()
        item['title'] = response.xpath('/html/head/title/text()').extract()
        yield item

Alt text

Step 4 .
pipelines.py 檔案裡面的FirstdemoPipeline()函式,新增列印資訊的程式碼:

        print(item['title'])

Alt text

但是,現在執行程式,是不能輸出任何資訊的,還需要做Step 5

Step 5 . 開啟piplines(預設piplines是關閉的。)
settings.py 檔案,將裡面的ITEM_PIPELINES 項的註釋去掉。並從核心目錄開始定位,定位到pipelines.py 檔案裡面的FirstdemoPipeline()函式 ,就應該是:firstdemo.pipelines.FirstdemoPipeline

Alt text

2-1.4 執行

DOS視窗 中,先將路勁切換到當前爬蟲專案firstdemo路徑下,然後在執行爬蟲檔案 baidy

D:
cd D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo
scrapy crawl baidu --nolog

Alt text


2-2.1 使用Scrapy爬蟲CSDN的部落格文章

建立一個爬蟲檔案爬取CSDN部落格文章。

scrapy genspider -t basic csdn blog.csdn.net

輸出:

Alt text

2-2.2 觀察 http://blog.csdn.net/ 網頁原始碼

(網頁原始碼太多,這裡就不貼出了。)

提取資訊,一般使用 xpath 或者 正規表示式 來提取。

2-2.3 寫程式碼

Step 1 . items.py 檔案中的FirstdemoItem()函式中新增新的項。其他的檔案會使用這幾個物件:

    detail = scrapy.Field()
    link = scrapy.Field()

Alt text

Step 2 . csdn.py 檔案裡面,使用xpath 表示式 提取csdn部落格網頁的博文標題、介紹、連結地址。

# -*- coding: utf-8 -*-
import scrapy
from firstdemo.items import FirstdemoItem


class CsdnSpider(scrapy.Spider):
    name = "csdn"
    allowed_domains = ["blog.csdn.net"]
    start_urls = ['http://blog.csdn.net/']

    def parse(self, response):
        item = FirstdemoItem()
        item['title'] = response.xpath("//h3[@class='tracking-ad']/a/text()").extract()
        item['detail'] = response.xpath("//div[@class='blog_list_c']/text()").extract()
        item['link'] = response.xpath("//h3[@class='tracking-ad']/a/@href").extract()
        yield item

Alt text

Step 3 . piplines.py 檔案中,新增下面的程式碼,輸出顯示爬取到的資訊。

        for i in range(0, len(item['title'])):
            print('第' + str(i+1) + '篇文章:')
            print(item['title'][i])
            print(item['detail'][i])
            print(item['link'][i])
            print('---------')

Alt text

2-1.4 執行

scrapy crawl csdn --nolog

執行輸出的資訊太少,說明程式有問題。

scrapy crawl csdn

如果你在執行的時候,找到錯誤提示資訊:

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 10: illegal multibyte sequence

這個問題經常會遇到,是一個常見的問題,解決辦法在這裡可以找到。

         print(item['detail'][i].replace(u'\xa0 ', u' '))

輸出:

第1篇文章:
微信小程式:小程式,新場景
前言:我們頻繁進入的地方,是場景。手機,是場景;瀏覽器,是場景;其實,微信,也是場景……微信要做的是佔據更多使用者時間、佔
據更多應用場景、佔據更多服務入口,這是商業本質想去壟斷要做的事情。對於大家來講,...
http://blog.csdn.net/liujia216/article/details/53350247
---------
第2篇文章:
Android四大元件——BroadcastReceiver普通廣播、有序廣播、攔截廣播、本地廣播、Sticky廣播、系統廣播
BroadcastReceiver普通廣播、有序廣播、攔截廣播、本地廣播、Sticky廣播、系統廣播
  本篇文章包括以下內容:


  前言
  BroadcastReceiver的簡介
 ...
http://blog.csdn.net/qq_30379689/article/details/53341313
---------
第3篇文章:
Gif格式簡要介紹
Gif格式的介紹

為什麼有的Gif圖不能夠迴圈播放及處理辦法
http://blog.csdn.net/shiroh_ms08/article/details/53347873
---------
第4篇文章:
win10 uwp 打包第三方字型到應用
有時候我們會把一些特殊字型打包到軟體,因為如果找不到我們的字型會變為預設,現在很多字型圖示我們用得好,有時候我們的應用會
用很漂亮的字型,需要我們自己打包,因為使用者一般是沒有字型。UWP使用第三方字型首...
http://blog.csdn.net/lindexi_gd/article/details/52716655
---------
第5篇文章:
話說智慧指標發展之路
動態建立記憶體的管理太麻煩,於是乎,這個世界變成11派人:
一派人勤勤懇懇按照教科書的說法做,時刻小心翼翼,苦逼連連;
一派人忘記教科書的教導,隨便亂來,搞得程式碼處處bug,後期維護罵聲連連;
最...
http://blog.csdn.net/jacketinsysu/article/details/53343534
---------
第6篇文章:
安卓自定義控制元件(二)BitmapShader、ShapeDrawable、Shape
第一篇部落格中,我已經對常用的一些方法做了彙總,這篇文章主要介紹BitmapShader點陣圖渲染、ComposeShader組合渲染,然後看看Xferm
ode如何實際應用。不過本文還是隻重寫onDraw...
http://blog.csdn.net/chen413203144/article/details/53343209
---------
第7篇文章:
JSTL 標籤大全詳解
1、什麼是JSTL?    JSTL是apache對EL表示式的擴充套件(也就是說JSTL依賴EL),JSTL是標籤語言!JSTL標籤使用以來非常方便,它與JSP
動作標籤一樣,只不過它不是JSP內...
http://blog.csdn.net/qq_25827845/article/details/53311722
---------
第8篇文章:
Android除錯大法 自定義IDE預設簽名檔案
你是否為除錯第三方SDK時debug簽名和release簽名發生衝突而煩惱?你是否在debug時第三方功能測試通過,而release時無法使用?你
是否在為對接微信、支付寶、地圖因簽名導致的問題而煩惱?...
http://blog.csdn.net/yanzhenjie1003/article/details/53334071
---------
第9篇文章:
Android圖表庫MPAndroidChart(十二)——來點不一樣的,正負堆疊條形圖
Android圖表庫MPAndroidChart(十二)——來點不一樣的,正負堆疊條形圖
  接上篇,今天要說的,和上篇的類似,只是方向是有相反的兩面,我們先看下效果  實際上這樣就導致了我們的程式碼是...
http://blog.csdn.net/qq_26787115/article/details/53333270
---------
第10篇文章:
一步步手動實現熱修復(二)-類的載入機制簡要介紹
一個類在被載入到記憶體之前要經過載入、驗證、準備等過程。經過這些過程之後,虛擬機器才會從方法區將代表類的執行時資料結構轉換為
記憶體中的Class。

我們這節內容的重點在於一個類是如何被載入的,所以我們從類...
http://blog.csdn.net/sahadev_/article/details/53334911
---------
第11篇文章:
仿射變換詳解 warpAffine
今天遇到一個問題是關於仿射變換的,但是由於沒有將仿射變換的具體原理型明白,看別人的程式碼看的很費解,最後終於在師兄的幫助下
將原理弄明白了,我覺得最重要的是理解仿射變換可以看成是幾種簡單變換的複合實現,
...
http://blog.csdn.net/q123456789098/article/details/53330484
---------
第12篇文章:
React Native嵌入Android原生應用中
開發環境準備首先你要搭建好React Native for Android開發環境, 沒有搭建好的可以參考:React Native for Android Windows環境
搭建  用Android...
http://blog.csdn.net/u011965040/article/details/53331859
---------
第13篇文章:
TCP三次握手四次揮手詳解
TCP三次握手四次揮手詳解
http://blog.csdn.net/u010913001/article/details/53331863
---------
第14篇文章:
騰訊Android面經
秋招收官最後一戰。
騰訊一面(電話):
自我介紹
專案,平時怎麼學習?
設計模式
(1)知道哪些設計模式?設計模式在Android、Java中是怎麼應用的,每個都說一下?
(2)InputStre...
http://blog.csdn.net/kesarchen/article/details/53332157
---------
第15篇文章:
輕鬆實現部分背景半透明的呈現效果
實現一個簡單的呈現/解散動畫效果,當呈現時,呈現的主要內容和背景要明顯區分,背景呈現一個半透明遮罩效果,透過背景可以看到
下層 View Controller 的內容
http://blog.csdn.net/kmyhy/article/details/53322669
---------
第16篇文章:
APP自動化框架LazyAndroid使用手冊(4)--測試模板工程詳解
概述前面的3篇博文分別對lazyAndroid的框架簡介、元素抓取和核心API進行了說明,本文將基於框架給出的測試模板工程,詳細闡述下
使用該框架進行安卓UI自動化測試的步驟。
http://blog.csdn.net/kaka1121/article/details/53325265
---------
第17篇文章:
Android使用getIdentifier()方法根據資源名來獲取資源id
有時候我們想動態的根據一個資源名獲得到對應的資源id,就可以使用getResources().getIdentifier()方法來獲取該id。然後再使用該
id進行相關的操作。
1、Demo示例
  下...
http://blog.csdn.net/ouyang_peng/article/details/53328000
---------
第18篇文章:
Android基於RecyclerView實現高亮搜尋列表
這篇應該是RecycleView的第四篇了,RecycleView真是新生代的寵兒能做這麼多的事情。轉載請註明作者AndroidMsky及原文連結
http://blog.csdn.net/and...
http://blog.csdn.net/androidmsky/article/details/53306657
---------
第19篇文章:
使用Git Hooks實現開發部署任務自動化
提供:ZStack雲端計算 前言版本控制,這是現代軟體開發的核心需求之一。有了它,軟體專案可以安全的跟蹤程式碼變更並執行回溯、完整
性檢查、協同開發等多種操作。在各種版本控制軟體中,git是近年來最流行的軟...
http://blog.csdn.net/zstack_org/article/details/53331077
---------
第20篇文章:
Andromeda OS 來了,Android 再見?
相信有部分同學已經有耳聞了,前幾天炒的很火一個訊息,就是 Google 要推出一種全新的作業系統,取名 Andromeda,這款新型的操作
系統融合了 Android 和 Chrome OS,據稱已經有...
http://blog.csdn.net/googdev/article/details/53331364
---------

我用英語跟小販交談,突然畫面一下就全暗,我回臺上,終於輪我上場。


請訪問:http://www.aobosir.com/

相關文章