Python 爬蟲實戰 4

目錄

Requests 模塊

安裝 Requests 模塊

項目:用 requests 實現雲棲社區博文爬蟲實戰

分析過程

編寫代碼

爬取結果

Scrapy 模塊

安裝 Scrapy

配置 pywin32

Scrapy 指令實戰

(1)創建爬蟲項目

(2)  進入新建爬蟲項目,用爬蟲模板創建一個爬蟲項目:scrapy genspider -t basic fst shuqi.com

(3)運行爬蟲文件:scrapy crawl fst

Scrapy 爬蟲項目編寫基礎

項目:爬取阿里文學首頁的書名

打開網址,查看分析,找出正則表達。

開始編寫 fst.py 爬蟲文件

項目:使用 Scrapy 編寫噹噹網商品數據爬蟲實戰

創建項目 - 編寫 items.py – 編寫爬蟲文件 – 編寫pipelines – settings - 運行

運行測試:scrapy crawl dd成功

查看MySQL 的 python_dd 數據庫,成功插入,兩頁一共111個結果

修改搜索頁面爲100頁後運行

附:Pymysql 相關

附:噹噹網提取關鍵字的分析:書名、鏈接、價格、評論


Requests 模塊

爬蟲最重要的是網頁分析+反爬蟲措施,而不是技術本身。

安裝 Requests 模塊

pip install requests

Requests 介紹:

-- Requsts.請求方式:get、post、put……

在 urllib中,要模擬瀏覽器的話,需要創建opener對象來進行處理。而 requests 統統可以用參數處理。比如,模擬瀏覽器,等都需要參數完成。

參數:

Params: get請求的相應參數,字典方式存儲。

Headers:僞裝瀏覽器要用到,需要添加頭信息,字典方式存儲

Proxies:添加代理,字典方式存儲,可以放置{協議名:代理IP}

Cookies:

Data:post請求中發過去的數據。

屬性:

Text:decode之後的響應數據

Content:響應數據,(b)類型的流數據

Encoding:調用當前網頁的編碼

Cookies:當前網頁請求的cookies

url:當前請求的url

status_code:當前請求的狀態碼

 

實驗中,因爲python進程佔用了端口8888,所以改動fiddler端口名8888爲8887.

項目:用 requests 實現雲棲社區博文爬蟲實戰

網址:https://yq.aliyun.com/ , 頁面內搜索關鍵字 “Python”,獲得搜索結果的網址:https://www.aliyun.com/ss/?k=Python

目標:實現自動翻頁,並拿到每頁的具體博文數據。

不同頁面的 url :

第一頁:https://www.aliyun.com/ss/?k=Python 或者 https://www.aliyun.com/ss/UHl0aG9u/a/1

第2頁:https://www.aliyun.com/ss/UHl0aG9u/a/2/?spm=5176.10695662.1996646101.103.4ebf259fVLSU32

第3頁:https://www.aliyun.com/ss/UHl0aG9u/a/3/?spm=5176.10695662.1996646101.104.292d259fyk1e3X

再訪問變:https://www.aliyun.com/ss/UHl0aG9u/a/3/?spm=5176.10695662.1996646101.103.364f259f39yYKF

第4頁:https://www.aliyun.com/ss/UHl0aG9u/a/4/?spm=5176.10695662.1996646101.105.630f259f7Bkyml

第五頁:https://www.aliyun.com/ss/UHl0aG9u/a/5/?spm=5176.10695662.1996646101.103.2285259fCWKkmz

測試:spm後面的參數去掉,看能不能訪問。發現可以,所以該參數無關緊要,重要的是 “a/” 後面的數字。

測試:https://www.aliyun.com/ss/?k=Python/a/2。 發現可以訪問,可以猜到UHl0aG9u是關鍵詞python的編碼變換。

分析過程

搜索結果的頁面數量:

頁面數量正則表達式提取:

pat1 = '<span class="p-total">共有(.*?)頁'    # 一共多少頁

每一頁的 url 鏈接:

# 每頁的鏈接 = url+page number
url = "https://www.aliyun.com/ss/UHl0aG9u/a/" + str(i+1)

每一頁中單個博文的 url 鏈接提取:

pat_url = '<h3>.*?<a .*?href="(https://help.*?)" class="y-blue">'

單個博文頁面內的信息獲取:

(1)文章標題:

pat_title = '<h1>(.*?)</h1>' 

(2)文章內容:

pat_content = '<div class="markdown-body" >(.*?)<div class="help-detail-page-turner">'     

編寫代碼

代碼流程:同分析流程寫代碼即可。

爬取結果

文件保存在 "aliPython_Pa"

Scrapy 模塊

課程網址:https://edu.aliyun.com/lesson_1994_17794#_17794

安裝 Scrapy

視頻中老師的安裝流程如下:

我的Python 爬蟲項目統一在 tensorflow2 環境下執行。

  1. 因爲我已經安裝了 lxml,所以直接安裝 “pip install scrapy”
  2. 中間有顯示黃色警告,先不管,後面有問題再解決,再安裝下 “pip install twisted“
  3. 最後 “pip install pywin32” 提示已經安裝。

【網絡不好請訪問下面網址,下載相應 wheel 後 pip 離線安裝相關包即可】

安裝過程的相關圖片如下:

配置 pywin32

因爲我是在tensorflow2 環境下安裝的,所以進入 tensorflow2 環境進行配置。

1. 目錄下搜素 pywin32,打開 pywin32_system32 文件夾,可以看到兩個 .dll 動態文件。

比如,我的目錄爲:“D:\PACKAGE\Anaconda3\envs\tensorflow2\Lib\site-packages\pywin32_system32”

2. 手動複製上面的兩個文件到 “C:\Windows\System32” 目錄下。

3. OK,完成了 scrapy 安裝。

Scrapy 指令實戰

startproject 爬蟲項目名稱
genspider -l                        # 查看爬蟲模板
genspider -t 模板 爬蟲文件名 域名     # 創建爬蟲
crawl                               # 運行爬蟲
list                                # 查看有哪些爬蟲

(1)創建爬蟲項目

新建一個空文件夾 “scrapy_proj_practice”,anaconda Prompt 下激活tensorflow2 環境(自己在哪裏安裝的在哪裏的命令行下運行即可),cd 命令切換到剛剛新建的“scrapy_proj_practice”文件夾。

命令:scrapy startproject ali_first

運行命令後多了一個項目文件夾。

.cfg 是配置文件,不用管。

核心文件夾如下,是一個半成品爬蟲文件

> items.py         定義目標。比如你要爬什麼信息,比如要爬文章的標題、內容等,標題和內容就是兩個容器,可以放到item中。

> spiders 文件夾   可以放多個自己寫的爬蟲文件。

> middlewares.py   一箇中間件。中間要處理相應東西時,可以編寫。

> pipelines.py      主要用於爬後處理。比如,爬取後的東西要寫進數據庫,會需要相應操作。

> settings.py       設置信息,是整個項目的整體配置文件信息。

(2)  進入新建爬蟲項目,用爬蟲模板創建一個爬蟲項目:scrapy genspider -t basic fst shuqi.com

--進入項目,查看當前項目下有哪些爬蟲母版(scrapy genspider -l),看到當前有4個爬蟲母版:基礎、通用、爬csv文件數據、爬xml數據。

【基於該母版可以很快創建一個爬蟲文件】

--基於基礎母版創建一個爬蟲文件:

scrapy genspider -t basic fst shuqi.com

命令:scrapy genspider -t basic 爬蟲文件名 域名

【注意,域名不包括前面的www】

本案例使用阿里文學的域名。

(3)運行爬蟲文件:scrapy crawl fst

當前沒有任何數據,所以只是走了個流程,沒什麼實際作用。

查看當前有哪些可用的爬蟲文件:scrapy list

更多scrapy 指令查看,比如 bench,check 等,需要的話網上搜索使用。本次指令實戰裏面展示的都是常用的,基本夠用。

Scrapy 爬蟲項目編寫基礎

指令順序:

  •  命令: scrapy startproject ali_first
  •  編寫 items.py
  •  命令: scrapy genspider -t 爬蟲母版 爬蟲文件名 域名
  •  編寫爬蟲文件
  •  編寫pipelines,可有可無,建議加上。
  •  配置 settings

項目:爬取阿里文學首頁的書名

流程:打開網址—>右擊查看網頁源代碼—>Ctrl+F打開搜索框—>搜索其中一個署名—>觀察所處位置—>編寫正則表達式—>編寫代碼。

打開網址,查看分析,找出正則表達。

搜索查看是不是 <a target="_blank" href="/cover?bid,發現完全符合,一共203個書籍記錄。但是,這個表達式不太好寫,因爲在title文本前有的還有一些內容,有的沒有。所有情況如下圖,有4種情況:

視頻中老師用的是, <p class="title">,只能查找的到 141個(如下圖)。推薦目錄裏面的小說沒有算在內。即,上面的2沒有包含在內。
需要注意,用XPath時,需要設置兩個提取3個提取方式,1、3、4,視頻中的老師值寫了3的。
本文使用1,2,3,4的模式查找全部的文章,推薦小說和頁面小說內容有重複的,之後去重即可。

開始編寫 fst.py 爬蟲文件

item.py 定義目標 -- 使用/存入定義的容器title – 試運行查看title輸出結果。

(1) item.py定義目標:創建 title 容器

(2)fst.py 中使用 title 容器,用xpath 存title。

使用視頻種使用的關鍵詞 <p class="title"> 的XPath表達式,運行測試:scrapy crawl fst

測試結果(部分):

運行發現,並沒有我們代碼中輸出的 “-“*20的橫線。

這是因爲此時 pipeline的文件還不能運行,因爲沒有開啓,需要在settings.py中全局設置開啓。

(3)settings.py全局設置開啓 pipeline後運行查看。Pycarm 中 ctrl+F 打開搜索框,在 settings.py 中搜索 Pipeline,去掉註釋,開啓 pipeline。

注意:ali_first.pipelines.AliFirstPipeline

名字必須對應正確。

 

同樣地,如果要僞裝瀏覽器,也可以在 settings.py中設置。比如,搜索User-agent 可以設置僞裝自己的瀏覽器。

 

(4)開啓後crawl 命令運行查看,正確運行。

項目:使用 Scrapy 編寫噹噹網商品數據爬蟲實戰

進入噹噹網搜索Python,複製鏈接: http://search.dangdang.com/?key=Python&act=input

轉到第二頁是:http://search.dangdang.com/?key=Python&act=input&page_index=2

流程如下:

創建項目 - 編寫 items.py – 編寫爬蟲文件 – 編寫pipelines – settings - 運行

  • scrapy startproject Dangdang
  • cd dangdang
  • 編寫items.py,包括所需爬蟲目標。

  • scrapy genspider -t basic dd dangdang.com

查看MySQL 的 python_dd 數據庫,成功插入,兩頁一共111個結果

修改搜索頁面爲100頁後運行

修改爲爬取100頁的數據,對之前的插入數據執行,若已經插入,就忽略。

Pipelines.py 添加的代碼部分。

成功運行。

再查看SQL裏面更新的表格記錄,5570個記錄,按道理講應該是每頁60*100=6000,可見中間有失敗回滾的。

附:Pymysql 相關

pipelines.py 進行後處理時,需要安裝 pymysql 包, pip install 即可,安裝好了後需要改數據庫的源代碼,在對應安裝環境的目錄下,我在 tensorflow2 環境下。

打開 connections.py, ctrl+F 搜索 chaset= , 值填爲 ‘utf8’, 防止亂碼。

此時需要開啓MySQL,我之前已經安裝了,直接開啓就好。如下圖。

進入mysql 命令: mysql -uroot -p

創建噹噹數據庫 dd

創建Python書籍售賣表格 Python_dd

附:噹噹網提取關鍵字的分析:書名、鏈接、價格、評論

P1:源代碼頁搜索,“Python編程 從入門到實踐“

P1:源代碼頁搜索,“Python編程 從入門到實踐“,3個結果,定義爲 <a title

搜索 <a title,發現每本書有兩個,要前面一個就好

怎麼區分第一個和第二個? -- 用屬性區分,本文用第二個。

第1個title包含屬性: <a name="itemlist-picture">

第2個title包含屬性:<a name="itemlist-title">

順便也發現鏈接同樣在此處,不用找了,就是 href屬性。

 

接下來找評論,就找第一個商品的搜索29506。

所在代碼區域爲複製文本爲:

<a href="http://product.dangdang.com/23997502.html?point=comment_point" target="_blank" name="itemlist-review" dd_name="單品評論" class="search_comment_num" ddclick="act=click_review_count&pos=23997502_0_1_q">29506條評論</a>

同樣地,查找第一個的商品價格。

定位爲,如下圖,60 個全部正確查找。

<p class="price" > <span class="search_now_price">&yen;66.20</span>

定位爲,如下圖,60 個全部正確查找。

<span class="search_now_price">&yen;66.20</span>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章