點擊關注 異步圖書,置頂公眾號
每天與你分享 IT好書 技術乾貨 職場知識
重要提示1:本文所列程序均基於Python3.6,低於Python3.6的Python版本可能無法運行.
重要提示2:因所抓取的網站可能隨時更改展示內容,因此程序也需及時跟進.
重要提示3:本程序僅供學習,不能拿去做壞事.
1.安裝Python 3.6;
2.安裝以下庫:
1 1. requests(2.12.4);
2 2. BeautifulSoup(4.5.1)(pip install beautifulsoup4);
3 3. urllib3(1.19.1);
整個程序,按照下面的步驟:
1.獲取要爬取頁面的URL地址(可以是分頁地址,可以在程序裡面模擬分頁);
2.通過requests(一個封裝了urllib3的網絡庫,簡化了很多網絡請求的東西)下載上面URL地址的內容到內存(以前的方式是保存臨時文件);
3.用BeautifulSoup(一個解析HTML的庫)來讀取第二步中保存在內存中的內容,並解析出我們要的主要內容部分;
4.保存到資料庫或展示(特別說明:本示例程序不包含資料庫部分),程序最終會輸出多條json數據(已經包含了來源網站(自己定義的),創建時間等)
上述部分體現在代碼中,就是如下:
首先在Main.py中,定義:
1class Budejie(object):
2 '''
3 獲取格式化後的數據.
4 '''
5 def content(self,data):
6 common = CommonGrab()
7 return common.formatContent(data,".j-r-list-c-desc")
用來格式化不得姐獲取到的數據,下面還要定義一個Qsyk來處理來自糗事百科的數據:
1class Qsyk(object):
2 '''
3 獲取格式化後的數據.
4 '''
5 def content(self,data):
6 common = CommonGrab()
7 return common.formatContent(data,".content")
代碼中還有一個Kanqu.com的抓取處理,這裡就不羅列了,這幾個唯一的區別就是:調用common.formatContent時,傳遞的第二個參數不一樣,第二個參數為要抓取的內容(HTML)的class.
CommonGrab中依賴了UserUtils.py中的代碼.
下面是CommonGrab的定義,在CommonGrab中主要做了兩件事:
抓取網頁內容,保存到內存;
解析HTML內容(使用BeautifulSoup)
將數據新增到資料庫中.(不新增資料庫到資料庫中.)
代碼如下:
1class CommonGrab(object):
2 '''
3 抓取網頁文件內容,保存到內存
4 @url 欲抓取網站地址
5 '''
6 def getPageData(self, urls, pageSize,network,timeout=(20.0,20.0)):
7 headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"}
8 htmldata = []
9 startItem = 1
10 for x in range(startItem, pageSize):
11 tmpurl = ""
12 tmpurl = urls + "%d" % (x)
13 data = network.requestsGet(url=tmpurl,headers=headers,timeout=timeout)
14 htmldata.append(data.text)
15 return htmldata
16 '''
17 解析HTML內容(使用BeautifulSoup).
18 @data:數據內容.
19 @formatStyle:格式化參數.例如:css的名稱或者div的id.
20 返回整理過的數據列表.
21 '''
22 def formatContent(self,data,formatStyle):
23 bs = BeautifulSoup(data,"html.parser")
24 htmlutil = HTMLUtils()
25 return [htmlutil.replaceAllHtmlTag(x.text) for x in bs.select(formatStyle)]
26
27
28
29 def insertDataDB(self,dataarray,source):
30 date = DateUtils()
31 createDate = date.formatDateToStr(formatv=FormatDates.YY_MM_DD_HH_MM_SS)
32 if dataarray and source:
33 insertda = [({"value":""+item.replace("","").replace("\","").replace("\u3000","").replace("n","")+"","source":""+source+"","createDate":""+createDate+""}) for item in dataarray]
34 print(insertda)
35
36
37
38
39
40
之後就是把上述的幾部分組合起來.
運行部分的代碼如下,主要就是調用了上述幾部分的代碼:
1 print("正在執行.稍等一會")
2 qs = Qsyk()
3 cg = CommonGrab()
4 fileutil = FileUtils()
5 network = NetWorkUtils()
6
7
8 pageSize = 2
9
10
11
12
13
14
15
16
17 qiubaiurl = "http://www.qiushibaike.com/textnew/page/"
18
19 htmls =cg.getPageData(qiubaiurl, pageSize,network)
20 qsbkdata= qs.content(str(htmls))
21
22
23 budejieurl="http://www.budejie.com/text/"
24
25 budejiehtml=cg.getPageData(budejieurl,pageSize,network)
26 bdj=Budejie()
27 bdjdata=bdj.content(str(budejiehtml))
28
29
30 kanquurl = "http://www.kanqu.com/cat/1?page="
31 kanquhtml = cg.getPageData(kanquurl,pageSize,network)
32 kanqu = KanQu()
33 kanqudata = kanqu.content(str(kanquhtml))
34
35
36 cg.insertDataDB(qsbkdata,"qiushibake")
37 cg.insertDataDB(bdjdata,"budejie")
38 cg.insertDataDB(kanqudata,"kanqu")
39
CSDN:
https://download.csdn.net/download/dcxy0/9835268
Coding.net:
https://coding.net/u/pruidong/p/Python3GetQsbkBdj/git
文件:
main.py: 運行
UserUtils.py:工具
Python 3.7 將於2018-06-15發布(參考:PEP537).
到時可能會依據Python 3.7更新此程序.
異步社區是一個有料、有貨,又專業的IT專業圖書社區,在這裡可以讀到最新、最熱的IT類圖書!我想要社區的《Python程序設計(第3版)》這本書,Python之父推薦,人生苦短,我用Python,一定要看,請大家幫我點讚!
本文來源於異步社區,作者:dcxy,作品《Python3抓取糗百、不得姐》,未經授權,禁止轉載。
推薦閱讀