1. 程式人生 > >如果你不會Python多程序!那你會爬蟲?扯淡!抓取拉鉤網十萬資料

如果你不會Python多程序!那你會爬蟲?扯淡!抓取拉鉤網十萬資料

這篇文章我們來抓取 拉鉤網 的招聘資訊。全部抓取大概十幾萬條全國招聘資訊,並且儲存資料庫。

準備

安裝Mongodb資料庫

其實不是一定要使用MongoDB,大家完全可以使用MySQL或者Redis,全看大家喜好。這篇文章我們的例子是Mongodb,所以大家需要 下載 它。

最後我們需要開啟管理員許可權的 CMD 視窗,執行如下命令,安裝資料庫成服務:

"C:\mongodb\bin\mongod.exe" --config "C:\mongodb\mongod.cfg" --install

設定為服務後,需要在管理員許可權開啟的windows cmd視窗用服務的方式啟動或停止MongoDB。

我們先獲取首頁HTML檔案:

import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
url = 'https://www.lagou.com/'
# 獲取頁面原始碼函式
def get_page_resp(url):
 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
 try:
 resp = requests.get(url, headers=headers)
 if
resp.status_code == 200: return resp.text return None except RequestException: return None soup = BeautifulSoup(get_page_resp(url), 'lxml')

然後我們開啟開發者工具,找到招聘職業的位置。

分頁

我們首先來分析下網站頁數資訊。經過我的觀察,每個職位的招聘資訊最多不超過 30 頁。也就是說,我們只要從第 1 頁迴圈到第 30 頁,就可以得到所有招聘資訊了。但是也可以看到有的職位招聘資訊,頁數並不到 30 頁。以下圖為例:

如果我們訪問頁面:https://www.lagou.com/zhaopin/Java/31/

也就是第 31 頁。我們會得到 404 頁面。所以我們需要在訪問到404頁面時進行過濾。

if resp.status_code == 404:
 pass

這樣我們就可以放心的 30 頁迴圈獲得每一頁招聘資訊了。

我們的每一頁url使用format拼接出來:

link = '{}{}/'.format(url, str(pages))

獲取資訊

獲取到全部資訊後,我們同樣的把他們組成鍵值對字典。

for position,add,publish,money,need,company,tag,fuli in \
 zip(positions,adds,publishs,moneys,needs,companys,tags,fulis):
 data = {
 'position' : position.get_text(),
 'add' : add.get_text(),
 'publish' : publish.get_text(),
 'money' : money.get_text(),
 'need' : need.get_text().split('\n')[2],
 'company' : company.get_text(),
 'tag' : tag.get_text().replace('\n','-'),
 'fuli' : fuli.get_text()
 }

組成字典的目的是方便我們將全部資訊儲存到資料庫。

儲存資料庫

儲存資料庫前我們需要配置資料庫資訊:

import pymongo
client = pymongo.MongoClient('localhost', 27017)
lagou = client['lagou']
url_list = lagou['url_list']

這裡是一個pool程序池,我們呼叫程序池的map方法.

map(func, iterable[,chunksize=None])

多程序Pool類中的map方法,與Python內建的map函式用法行為基本一致。它會使程序阻塞,直到返回結果。需要注意,雖然第二個引數是一個迭代器,但在實際使用中,必須在整個佇列都就緒後,程式才會執行子程序。join()

方法等待子程序結束後再繼續往下執行,通常用於程序間的同步.

針對反爬

如果大家就這樣整理完程式碼,直接就開始抓取的話。相信在抓取的不久後就會出現程式中止不走了。我剛剛第一次中止後,我以為是網站限制了我的 ip。於是我做了如下改動。

如果博主後面把全部資料抓下來後,可以和大家一起進行資料分析,分析Python招聘的一些資訊啊什麼的。大家加油。

進群:125240963  即可獲取原始碼