一個例子帶你學爬蟲

本文使用的是python3 只用了一個需要導入的包xlwt

下面是筆者的一段廢話 嘿嘿。

記得我纔開始接觸python的時候,天天聽網上這個公開課那個公開課讓報班學爬蟲,說爬蟲有多賺錢多厲害(但是他們的課貴啊QAQ)。我那時候就想不掏錢自己學,折騰了一段時間,也有一些小的經驗。當時我學的時候就經常會面臨看代碼一臉懵逼的狀態,於是今天就像做一個簡單的爬蟲並且具體解釋一下代碼,看完應該就能學會。做一個萌新友好型文章
( ̄▽ ̄)~*

完整代碼,下面都是分開講的所以完整代碼放到前面。

import urllib.request,re #urllib 包 re正則表達式python3自帶包不需要導入 urlib.request模塊 re正則表達式
import xlwt   #需要PIP安裝導入包
'''def getdata():#請求網頁內容  拿到靜態網站源代碼   函數不調用就無法print出數據 原始版本是這樣
	url = 'http://www.risfond.com/case/fmcg/47977'
	html = urllib.request.urlopen(url).read()
	print(html)'''

def getdata():#請求網頁內容  拿到靜態網站源代碼 我想一次獲得多個網頁 就將47977改爲變量 並進行字符串格式化 % format都是可以字符串格式化的
	url_list = []
	for i in range(47977,47997):
		url = 'http://www.risfond.com/case/fmcg/{}'.format(i) #字符串格式化.format
		html = urllib.request.urlopen(url).read().decode('utf-8')
		print(html)
#接下來用正則表達式解析源代碼
		page_list = re.findall(r'<div class="sc_d_c">.*?:<span class="sc_d_con">(.*?)</span></div>',html)#html表示源碼

		print(page_list)
		url_list.append(page_list)
	return url_list
#存儲數據 excel. 創建excel 數據的存儲
#創建excel表格
def excel_write(items):#將上一個函數的數據進行一個傳遞
	newTable = 'text2020.xls'
	wb = xlwt.Workbook(encoding='utf-8')
	ws = wb.add_sheet('sheet1')#保存這個表格 實際是保存wb
	headData = ['職位名稱', '職位低點', '時間', '行業','招聘時間','人數','顧問']
	for colnum in range(0,7):
		ws.write(0,colnum,headData[colnum],xlwt.easyxf('font:bold on'))#  0代表第一列 colnum代表有七列數據 headData【colnum】列表取值效果字體加粗
	index = 1
	for j in range(0,len(items)):#len計算長度
		for i in range(0,7): #往sheet1寫入
			ws.write(index,i,items[j][i])#j行i列
		index +=1

	wb.save(newTable)
items = getdata()
excel_write(items)

寫一個爬蟲的基本思路

  1. 對網站發起請求,獲取網頁源代碼
  2. 通過一定手段解析網站(獲取你所需的)
  3. 保存到你的電腦上(本文是保存到excel)
  4. 數據分析(發揮數據價值)

環境與包的準備

(看到這裏我就默認你安裝過python3.X了嘿嘿)如果你的電腦沒有xlwt包,那麼打開命令行(windows用戶) 輸入:pip install xlwt

引入包

import urllib.request,re#這兩個都是自帶的包 是urlllib.request模塊和 re正則表達式
import xlwt #需pip一下

請求網頁內容

請求網頁內容拿到靜態網站源碼(這次爬取的網站是個難度低的獵頭網站 網址:http://www.risfond.com/case/fmcg/47977

def getdata():#請求網頁內容  拿到靜態網站源代碼/ 原始版本是這樣
	url = 'http://www.risfond.com/case/fmcg/47977'
	html = urllib.request.urlopen(url).read()
	print(html)

url是統一資源定位符,我們將網站的網址填入即可,然後利用urllib.request.urlopen(url).read()讀取並將源碼存儲在變量html,但是很明顯這樣一個一個網頁爬取效率太低,我們就像一次爬取多個網站。於是便做了如下優化

請求網頁內容(優化)

首先我們發現這個獵頭公司的職務和人員介紹頁面,每點擊一次下一條網址的最後一個數字就+1,每點一次上一條網址的最後一個數字就-1.(說明它不反爬)。也就是說如果我們要批量獲取網頁信息只要讓末尾數字變化就行了。

def getdata():#請求網頁內容  拿到靜態網站源代碼 我想一次獲得多個網頁 就將47977改爲變量 並進行字符串格式化 % format都是可以字符串格式化的
	url_list = []
	for i in range(47977,47997):
		url = 'http://www.risfond.com/case/fmcg/{}'.format(i) #字符串格式化.format
		html = urllib.

我們採用 for循環一次性獲取了而是個網頁,但有一點要注意在url中我們不能直接就把原來那個數字的位置改成i,而是要把字符串格式化,例子裏使用的是format的格式化方法,同樣的%也可以實現格式化功能。這樣我們就實現了批量獲取網頁。(這些網頁是獵頭公司不同崗位和人員的信息並非是無意義網頁)

使用正則表達式解析源代碼

現在我們補寫這個函數,把獲取的網頁解析只拿我們想要的

def getdata():#請求網頁內容  拿到靜態網站源代碼 我想一次獲得多個網頁 就將47977改爲變量 並進行字符串格式化 % format都是可以字符串格式化的
	url_list = []
	for i in range(47977,47997):
		url = 'http://www.risfond.com/case/fmcg/{}'.format(i) #字符串格式化.format
		html = urllib.request.urlopen(url).read().decode('utf-8')
		print(html)
#接下來用正則表達式解析源代碼
		page_list = re.findall(r'<div class="sc_d_c">.*?:<span class="sc_d_con">(.*?)</span></div>',html)#html表示源碼因爲我們前面用html當了變量存儲了網頁源代碼

		print(page_list)
		url_list.append(page_list)
	return url_list

下面我們開始對解析部分源碼逐行解釋,利用re.findall方法 我們開始解析代碼,我們只需要我們想要的信息,這個例子中我們想要提取的是職位名稱,職位地點 時間 行業 招聘時間 人數 顧問 的信息 而這些信息都在在這裏插入圖片描述所以我們複製第一個標籤`

<div class="sc_d_c">職位名稱:<span class="sc_d_con">項目經理(13)</span></div>

然後我們刪除漢字部分只留下代碼 在用正則表達式進行匹配貪婪匹配。就成了這樣也就是

> page_list = re.findall(r'<div class="sc_d_c">.*?:<span
> class="sc_d_con">(.*?)</span></div>',html)#html表示源碼

這就完成了對源碼的解析

存數據入excel


```python
#存儲數據 excel. 創建excel 數據的存儲
#創建excel表格
items = getdata()
def excel_write(items):#將上一個函數的數據進行一個傳遞
	newTable = 'text2020.xls'
	wb = xlwt.Workbook(encoding='utf-8')
	ws = wb.add_sheet('sheet1')#保存這個表格 實際是保存wb
	headData = ['職位名稱', '職位低點', '時間', '行業','招聘時間','人數','顧問']
	for colnum in range(0,7):
		ws.write(0,colnum,headData[colnum],xlwt.easyxf('font:bold on'))#  0代表第一列 colnum代表有七列數據 headData【colnum】列表取值效果字體加粗
	index = 1
	for j in range(0,len(items)):#len計算長度
		for i in range(0,7): #往sheet1寫入
			ws.write(index,i,items[j][i])#j行i列
		index +=1

	wb.save(newTable)

我們創建了一個新函數,並把上面的數據傳入這個函數,然後我們開始創建excel,首先對其命名爲text2020,然後我們創建了一個Workbook採用utf-8編碼方式並命名爲wb,之後我們讓將wb的第一個表格(sheet1)命名成ws之後我們將數據寫入第一個sheet中,然後我們將表的各個模塊名稱寫入headData。

for colnum in range(0,7):
		ws.write(0,colnum,headData[colnum],xlwt.easyxf('font:bold on'))#  0代表第一列 colnum代表有七列數據 headData【colnum】列表取值效果字體加粗
	index = 1
	for j in range(0,len(items)):#len計算長度
		for i in range(0,7): #往sheet1寫入
			ws.write(index,i,items[j][i])#j行i列
		index +=1
	wb.save(newTable)

接下來對這段代碼的功能進行講解,首先第一個for循環我們將headData中的各個模塊寫入了表頭。然後我們利用了後面兩個循環實際是將數據分塊並分別寫入了一個七列和len(items)行的表格中的表格中,這是這一塊的功能 。(寫入的是sheet1也就是ws)。寫入表格之後呢,我們保存一下表格並命名爲text2020(因爲我們前面讓 newTable=‘text2020’了)

到這裏我們的兩個函數的書寫講完了,寫完函數我們一定不能忘記調用啊,就有人寫完函數之後直接就run了,run完還來找我問,你看看爲什麼不行呢…(╬ ̄皿 ̄)

下面我們調用函數

items = getdata()
excel_write(items)

好了,看到這裏我們這個項目就結束了,在運行之後你的python文件的文件夾裏應該會出現一個excel表格內容是這樣的:在這裏插入圖片描述Congratulation 。٩(ˊᗜˋ)و✧
整個項目的源碼在開頭,我是分開講的可能看着不方便。另外看完了的各位大爺,能不能賞小的個贊呢ღ( ´・ᴗ・` )。嘿嘿謝謝您。

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