1.確定爬取的目標
開始之前我們需要確定乙個爬取的目標,從上選乙個博主的首頁進入。在這個例子裡面我們要寫乙個爬蟲將博主的文章列表拉出來,儲存在乙個json的檔案裡面。
2. 「種子」的分析,生成爬蟲入口
我用的是pycharm編輯器,按照上述思路進行編碼。
匯入必要的依賴包
from __future__ import unicode_literals
from urllib import request
from pyquery import pyquery as pq
import json
'''更多python學習資料以及原始碼教程資料,可以在群1136201545免費獲取
'''
生成種子頁的http請求
url =
''with request.urlopen(url)
as response:
body = response.read(
) item =
#1. 先定義乙個空陣列,用於儲存提取結果
with
open
('output.json'
,'wt'
)as f:
# 2 將結果寫入json檔案
f.write(json.dumps(items)
)
上面**中用到了python檔案處理的知識,with語句是用於指定f的作用域,當f.write呼叫完成跳出with子句時就會被關閉,這樣可以防止開啟檔案後忘記呼叫close而鎖住檔案導致其它的程序不能訪問。
還用到了json.dumps方法,將items直接序列化成乙個標準的json字串,最後將這個json字串通過呼叫file物件的write方法寫入到檔案內。
現在需要解決的是如何生成這個items中的物件資料?
首先,需要將body中的內容讀到pyquery中,然後選出所有的文章元素,最後通過迴圈每個元素來處理,將元素的值生成乙個資料項填充到items中。
文章列表的選擇器為.forflow>.day,而這個選擇器一旦執行會返回多個元素的集合,而且我們需要將這個元素集合轉化成乙個item型別的集合,所以用pyquery.map函式完成這一轉換。
根據上面的分析,**如下:
from __future__ import unicode_literals
from urllib import request
from pyquery import pyquery as pq
import json
'''更多python學習資料以及原始碼教程資料,可以在群1136201545免費獲取
'''url =
''defparse_item
(i, e)
: doc = pq(e)
title = doc(
'.posttitle>a'
).text(
) parmerlink = doc(
'.posttitle>a'
).attr(
'href'
) pub_date = doc(
'.daytitle'
).text(
) summary = doc(
'.postcon'
).text(
) result =
print
(json.dumps(result)
)return result
with request.urlopen(url)
as response:
body = response.read(
) doc = pq(body)
items = doc(
'.forflow>.day').
map(parse_item)
with
open
('output.json'
,'wt'
)as f:
f.write(json.dumps(items, ensure_ascii=
false
))
需要說明的是,**中map函式是乙個高階函式,它的引數是另乙個處理函式的指標,所以這裡引用乙個parse_item,這個函式的內部實際上是乙個迴圈,它會將doc(.』forflow>.day』)乙個個傳入到parse_item函式中,當迴圈執行結束後再將多次從parse_item獲取的結果合成為乙個陣列返回。
此外,在**第一行加入 __future__模組,目的是解決json.dumps對字元內容進行unicode編碼的問題,完成後就會發現在當前爬蟲工作目錄中會多乙個名為output.json的檔案,開啟它後的樣子是:
..
.
總結
設計乙個完整爬蟲的思路與過程是:
確定爬取目標,分析種子頁結構
分析承載資料頁面結構,建立資料結構與元素選擇器間的對映關係
設計**流程與編寫思路
乙個特別適合初學爬蟲者的專案,感興趣的小夥伴趕緊執行**看看吧!
python爬蟲上手 筆記 2
通過各種了解,這種非同步重新整理的網頁似乎只能用瀏覽器加上模擬操作來實現重新整理。因為js需要乙個瀏覽器核心來解析。所以python phantomjs selenium看樣子是不錯的做法。這裡phantomjs號稱無頭 headless 瀏覽器。顧名思義,就是不需要header啦。於是很快找到樣例...
急求python爬蟲專案 python爬蟲專案
2020 01 13 def send file to client client socket,client addr 傳送檔案給客戶端 1.獲取檔名 file name client socket.recv 1024 decode utf 8 開啟檔案讀取資料 這裡不用with 因為開啟失敗wi...
Python程式設計快速上手 實踐專案
例如,字典值 意味著玩家有1條繩索 6個火把 42枚金幣等。寫乙個名為displayinventory 的函式,它接受任何可能的物品清單,並顯示如下 inventory 12 arrow 42 gold coin 1 rope 6 torch 1 dagger total number of ite...