目錄
(2) 進入新建爬蟲項目,用爬蟲模板創建一個爬蟲項目:scrapy genspider -t basic fst shuqi.com
創建項目 - 編寫 items.py – 編寫爬蟲文件 – 編寫pipelines – settings - 運行
查看MySQL 的 python_dd 數據庫,成功插入,兩頁一共111個結果
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 環境下執行。
- 因爲我已經安裝了 lxml,所以直接安裝 “pip install scrapy”
- 中間有顯示黃色警告,先不管,後面有問題再解決,再安裝下 “pip install twisted“
- 最後 “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
-
打開 dd.py 編輯,起始網址改爲:http://search.dangdang.com/?key=Python&act=input
打開該網站進行分析。分析過程圖太多,見後面小節(噹噹網提取關鍵字的分析:書名、鏈接、價格、評論)。
怎麼翻頁。翻頁需要不斷請求來爬取網址。
P2: http://search.dangdang.com/?key=Python&act=input&page_index=2
P3: http://search.dangdang.com/?key=Python&act=input&page_index=3
最後一個變化。
-
-
編寫 pipelines.py 進行後處理。見後面小節關於pymysql(Pymysql 相關),包括建數據庫和建表格。
-
使用mysql 之前,測試下代碼輸出是否正確。
需要去 settings.py 設置 pipelines 打開。
-
-
運行測試:scrapy crawl dd成功
-
運行結果如下。
-
-
修改dd.py上面,將結果寫入數據庫表格。運行成像:scrapy crawl dd ,查看結果如下圖。
查看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">¥66.20</span>
定位爲,如下圖,60 個全部正確查找。
<span class="search_now_price">¥66.20</span>