記得在前一段時間由于需要并且是第一次接觸爬蟲,沒有成功獲取到數據,了解爬蟲一段時間之后,再次爬取拉鉤網職位信息,本此采用單線程爬蟲,之后會發布scrapy寫法。
- 獲取的主要字段:
- 職位名稱
- 公司名稱
- 城市
- 公司規模
- 公司類型
- 月薪
- 行業領域
- firstType
- secondType
- 工作經歷
- 學歷
<strong>首先,輸入python工程師進行搜索,選擇城市之后發現url并未發生改變,通過抓包工具抓到了返回的json數據,這個時候我們就要考慮怎么去構造URL,下邊是抓包截圖</strong>
<strong>明白了數據的加載方式,接下來就要分析它所攜帶的參數和請求方式</strong>
<em>從上圖我們可以了解到URL及其攜帶的參數,那么接下來的工作就好辦了,我們只要傳遞相對應的參數就可以拿到返回的json串,具體構造方式看之后的分析,因為還牽扯到頁碼的分析</em>
<strong>搞明白了數據的加載的方式以及怎么構造URL,接下來就好考慮不同的職位、城市以及對應的分頁問題</strong>
<em>在相同地點點擊下一頁之后只有<strong>pn</strong>發生了改變,所以很顯然,<strong>pn</strong>控制分頁問題,接下來我們嘗試一下更換地點,與上圖進行對比看一下哪些參數變化了
從上圖可以看出更改地點之后<strong>city</strong>發生了變化,所以<strong>city</strong>控制城市,那么很顯然<strong>kd</strong>控制職位切換</em>
<strong>整明白了每個參數的含義,接下來我們就要考慮怎么找到到一個城市關于這個職位劃分的總頁數,從下圖我們可以看到一個職位在不同城市的總頁數是不同的</strong>
<strong>通過上邊的一些介紹,接下來開始講解每一部分的URL每一部分的參數的獲取和構造完整的URL。
首先,職位和城市我們就沒必要從網頁上拿,可以自己存一個列表,然后遍歷,那么就重點說一下總頁數的獲取
soup = BeautifulSoup(response.text, 'lxml')
pages = soup.find('span', {'class': 'span totalNum'}).get_text()
上邊說明了總頁數的位置及獲取方法,接著說一下 職位+城市+頁碼的變化整個的構造方法(城市主要是拉鉤網13個常用城市,先列兩個關于python的職位)</strong>
#獲取相關職位總頁數
def get_total_page():
kd = ['python工程師','python數據分析']
city = ['北京','上海','深圳','廣州','杭州','成都','南京','武漢','西安','廈門','長沙','蘇州','天津']
urls_kd = ['https://www.lagou.com/jobs/list_{}?px=default&city='.format(one) for one in kd]
for urls in urls_kd:
urls_city = [urls+one for one in city]
for url in urls_city:
response = requests.get(url, headers=headers, cookies=cookies)
location = url.split('&')[-1].split('=')[1]
key = url.split('/')[-1].split('?')[0].split('_')[1]
soup = BeautifulSoup(response.text, 'lxml')
pages = soup.find('span', {'class': 'span totalNum'}).get_text()
print '職業:{}獲取城市{}'.format(key,location)
create_url(pages,location,key)
#構造URL
def create_url(pages,city,kd):
for i in range(1,int(pages)+1):
url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city={}&needAddtionalResult=false'.format(city)
get_data(url,i,kd)
#獲取詳細數據寫入csv文件
def get_data(url,i,kd):
print '第{}頁數據'.format(i)
formdata = {
'first': 'true',
'pn': i,
'kd': kd
}
#注意這里是post請求
response = requests.post(url,headers=headers,cookies=cookies,data=formdata)
<strong>以上為核心代碼,剩余的就是解析json數據和寫文件了,就不一一列出來了</strong>
結果
總結
<strong>1遇到的問題
之前訪問該網站一直ip被封,后來就想著用代理ip,其實沒必要這么麻煩,只需要訪問的時候加上cookie就可以了,至少我現在訪問這些職位和城市沒出現ip被封的情況。
寫入csv文件出現多一行空行的問題——解決辦法
Python中的csv的writer,打開文件的時候,要小心,
要通過binary模式去打開,即帶b的,比如wb,ab+等
而不能通過文本模式,即不帶b的方式,w,w+,a+等,否則,會導致使用writerow寫內容到csv中時,產生對于的CR,導致多余的空行。2 感悟
對一個網頁的爬取的關鍵點在于怎么去找到這些數據的準確位置,而這個前提是了解URL構造,參數、以及請求方式,整明白這些就成功了一大半,對于后邊數據的提取就是一些常規的思路
單線程總體來說是比較慢的,之后改進加多線程或者用scrapy框架爬取數據
以上就是關于requests爬取拉鉤網的一個簡單的思路,有問題的可以留言或者評論一塊探討