利用python爬取58同城簡歷數據
利用python爬取58同城簡歷數據
最近接到一個工做,須要獲取58同城上面的簡歷信息(http://gz.58.com/qzyewu/)。最開始想到是用python裏面的scrapy框架製做爬蟲。可是在製做的時候,發現內容不能被存儲在本地變量 response 中。當我經過shell載入網頁後,雖然內容能被儲存在response中,用xpath對我須要的數據進行獲取時,返回的都是空值。考慮到數據都在源碼中,因而我使用python裏的beautifulSoup經過下載源碼的方式去獲取數據,而後插入到數據庫。javascript
須要的python包urllib2,beautifulSoup,MySQLdb,rehtml
第一,獲取整個頁面java
import urllib2
from BeautifulSoup import BeautifulSoup
url='http://jianli.58.com/resume/91655325401100'
content = urllib2.urlopen(url).read()
soup=BeautifulSoup(content)
print soup
1
2
3
4
5
6
7
url爲須要下載的網頁
經過urllib2.urlopen()方法打開一個網頁
read()方法讀取url上的數據python
第二,篩選你想要的數據
這裏須要用到正則表達式,python提供了強大的正則表達式,不清楚的小夥伴能夠參考一下資料(http://www.runoob.com/regexp/regexp-syntax.html)mysql
好比,咱們須要獲取姓名正則表達式
經過控制檯能夠看到名字所在的位置
這裏寫圖片描述sql
可用正則表達式進行匹配,代碼以下:shell
name = re.findall(r'(?<=class="name">).*?(?=)',str(soup))
1
運行程序,發現返回結果爲空。數據庫
檢查正則表達式是無誤的,咱們觀察以前返回的soup,發現他返回的源碼與網頁上的源碼是不同的。全部咱們根據觀察網頁上的源碼寫的正則表達式不能再返回的源碼中匹配到相應的內容。所以咱們只能經過觀察返回的源碼寫正則表達式。框架
這裏寫圖片描述
在soup返回的源碼中,咱們很容易地找到這我的的所有基本資料,並且都在標籤爲< li class=」item」>中,經過下面的fandAll()方法,很容易就獲取內容
data = soup.findAll('li',attrs={'class':'item'})
1
經過上面的代碼,能夠的到以下的結果,可見返回了一個list
這裏寫圖片描述
這樣,咱們就獲取了這我的的姓名,性別,年齡,工做經驗和學歷。
經過上面的方法,咱們可以獲取整個頁面你所須要的數據。
第三,把數據保存到數據庫
我使用的是mysql數據庫,因此這裏以mysql爲例
鏈接數據庫
conn = MySQLdb.Connect(
host = '127.0.0.1',
port = 3306,user = 'root',
passwd = 'XXXXX',
db = 'XXXXX',
charset = 'utf8')
cursor = conn.cursor()
1
2
3
4
5
6
7
由於要存儲中文,因此在這裏設置編碼格式爲utf8
建立插入語句
sql_insert = "insert into resume(
ID,name,sex,age,experience,education,pay,ad
,job,job_experience,education_experience)
values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
1
2
3
4
插入數據
cursor.execute(sql_insert,(ID,name,sex,age,experience,education
,pay,ad,job,job_experience,education_experience))
conn.commit()
1
2
3
關閉數據庫
cursor.close()
conn.close()
1
2
執行程序
報錯了…
(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 1")
1
發生這個錯誤,若是sql語法沒錯,通常就是編碼有問題了。
咱們的數據庫使用的編碼是utf8,應該是插入的數據在編碼上出現問題了。
咱們對返回的數據進行從新編碼用decode()和encode()方法實現
name = data[0].decode('utf-8').encode('utf-8')
1
用這個簡單的方法,咱們就解決了數據庫編碼與數據編碼不一致致使出錯的問題。
爲何編碼會不同呢?
這是由於,咱們用BeautifulSoup包爬取網頁的時候,返回的數據是ascii編碼的數據。而咱們的數據庫爲utf8編碼的,全部插入數據是會發生錯誤,只要對爬取的數據從新進行編碼
結果
這裏寫圖片描述
這個是我爬取的結果,效果仍是挺好的,速度大概是1秒個網頁,雖然比起scrapy要慢好多,可是BeautifulSoup和urllib2使用簡單,適合新手練手。
附錄:代碼
import urllib2
from BeautifulSoup import BeautifulSoup
import re
import MySQLdb
url = 'http://jianli.58.com/resume/91655325401100'
content = urllib2.urlopen(url).read()
soup = BeautifulSoup(content)
basedata = str(soup.findAll('li',attrs={'class':'item'}))
basedata = re.findall(r'(?<=class="item">).?(?=)',basedata)
ID = str(soup.findAll('script',attrs={'type':'text/javascript'}))
ID = re.findall(r'(?<=global.ids = ").?(?=";)',ID)
ID = ID[0].decode('utf-8').encode('utf-8')
name = basedata[0].decode('utf-8').encode('utf-8')
sex = basedata[1].decode('utf-8').encode('utf-8')
age = basedata[2].decode('utf-8').encode('utf-8')
experience = basedata[3].decode('utf-8').encode('utf-8')
education = basedata[4].decode('utf-8').encode('utf-8')
pay = str(soup.findAll('dd',attrs={None:None}))
pay = re.findall(r'(?<=
).\n.\n?.',education_experience)
education_experience = ''.join(education_experience).decode('utf-8').encode('utf-8')
conn = MySQLdb.Connect(
host = '127.0.0.1',
port = 3306,user = 'root',
passwd = 'XXXXX',
db = 'XXXX',
charset = 'utf8')
cursor = conn.cursor()
sql_insert = "insert into resume(ID, name,sex,age,experience,education,pay,ad,job,job_experience,education_experience) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
try:
cursor.execute(sql_insert, (ID, name,sex,age,experience,education,pay,ad,job,job_experience,education_experience))
conn.commit()
except Exception as e:
print e
conn.rollback()
finally:
cursor.close()
conn.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
利用python爬取58同城簡歷數據
第一獲取整個頁面
第二篩選你想要的數據
第三把數據保存到數據庫
鏈接數據庫
建立插入語句
插入數據
關閉數據庫
執行程序
結果
附錄代碼
文章標籤: python 58同城 數據
我的分類: 爬蟲
相關熱詞: 445利用 cpu利用 beef利用 fck利用 利用csrf
▼查看關於本篇文章更多信息
不會這些技術,大數據開發薪資不會高?
大數據技術與運用的成熟,應用集中於互聯網、金融、醫療、新能源、通訊和房地產等行業。整理平均薪資狀況和大數據學習大綱供查看
想對做者說點什麼? 我來講一句 weixin_42498033 weixin_424980332018-07-09 10:31:57#7樓 請問博主能給一下所用到的代碼嗎?謝謝!1782764024@qq.com qq_23704631 qq_237046312018-04-13 21:42:41#6樓 我聯繫方式qq1018141445 qq_23704631 qq_237046312018-04-13 21:41:38#5樓 能留個聯繫方式不