使用python實現簡答的爬蟲
python爬蟲的簡單實現
- 開發環境的配置
- python環境的安裝
- 編輯器的安裝
- 爬蟲的實現
- 包的安裝
- 簡單爬蟲的初步實現
- 將數據寫入到數據庫
-簡單的數據清洗
-數據庫的連接
-數據寫入到數據庫
開發環境配置
python環境的安裝
python環境使用的是3.0以上版本
為了便於安裝這裏使用的是anaconda
下載鏈接是anaconda
選擇下載64位即可
編輯器的安裝
這裏使用pycharm作為python開發的編輯器,下載網址 pycharm
在打開pycharm創建新項目的時候如下圖所示,那麽就代表了環境已經安裝好了
爬蟲的實現
包的安裝
我們這裏使用的爬蟲插件是beautifulsoup不屬於python的基礎庫,所以我們需要另行添加插件,在pycharm添加插件也是非常簡單的,只需要在file->settings->project->project interpreter添加對應的插件即可
點擊+號即可選擇需要的python包進行安裝
簡單爬蟲的初步實現
接下來就要開始真正的寫爬蟲了
#首先需要引入包from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("https://www.cnblogs.com/ladyzhu/p/9617567.html")#括號內的是需要爬取的網址地址 bsObj = BeautifulSoup(html.read()) print(bsObj.title)
將數據寫入到數據庫
簡單的數據清洗
前面我們已經爬取到到了一個簡單的網頁的信息,但是這些信息是雜亂無章的,接下我們已爬取研招網的院校庫為例,爬取每個院校的校名、所在地、院校隸屬,學習一下如何進行一個簡單的數據處理與爬取。
https://yz.chsi.com.cn/sch/?start=0
我們可以看到整個界面是十分復雜的,但是我們可以進行一個分析,我們所需要的數據僅僅是最下面的表格內的數據
通過查看網頁源碼可以發現,所有的院校信息確實是保存在下面的一個table之中的
<table class="ch-table"> <thead> <tr> <th>院校名稱</th> <th width="100">所在地</th> <th width="150">院校隸屬</th> <th width="100" class="ch-table-center">院校特性</th> <th width="100" class="ch-table-center">研究生院</th> <th width="100" class="ch-table-center">自劃線院校</th> <th width="90">在線咨詢</th> <th width="90">招生簡章</th> </tr> </thead> <tbody> <tr> <td> <a href="/sch/schoolInfo--schId-367878.dhtml" target="_blank">北京大學</a> </td> <td>北京</td> <td>教育部</td> <td class="ch-table-center"> <span class="ch-table-tag">985</span> <span class="ch-table-tag">211</span> </td> <td class="ch-table-center"> <i class="iconfont ch-table-tick"></i> </td> <td class="ch-table-center"> <i class="iconfont ch-table-tick"></i> </td> <td> <a href="/zxdy/forum--type-sch,forumid-455559,method-listDefault,start-0,year-2014.dhtml"target="_blank">進入</a> </td> <td class="text_center"> <a href="/sch/listZszc--schId-367878,categoryId-10460768,mindex-13,start-0.dhtml" target="_blank">查詢</a> </td> </tr> <tr> <td> <a href="/sch/schoolInfo--schId-367879.dhtml" target="_blank">中國人民大學</a> </td> <td>北京</td> <td>教育部</td> <td class="ch-table-center"> <span class="ch-table-tag">985</span> <span class="ch-table-tag">211</span> </td> <td class="ch-table-center"> <i class="iconfont ch-table-tick"></i> </td> <td class="ch-table-center"> <i class="iconfont ch-table-tick"></i> </td> <td> <a href="/zxdy/forum--type-sch,forumid-441209,method-listDefault,start-0,year-2014.dhtml" target="_blank">進入</a> </td> <a href="/sch/listZszc--schId-367879,categoryId-10460770,mindex-13,start-0.dhtml" target="_blank">查詢</a> </td> </tr> <tr> <td> <a href="/sch/schoolInfo--schId-367880.dhtml" target="_blank"> 清華大學 </a> </td> <td>北京</td> <td>教育部</td> <td class="ch-table-center"> <span class="ch-table-tag">985</span> <span class="ch-table-tag">211</span> </td> <td class="ch-table-center"> <i class="iconfont ch-table-tick"></i> </td> <td class="ch-table-center"> <i class="iconfont ch-table-tick"></i> </td> <td> <a href="/zxdy/forum--type-sch,forumid-441314,method-listDefault,start-0,year-2014.dhtml" target="_blank">進入</a> </td> <td class="text_center"> <a href="/sch/listZszc--schId-367880,categoryId-10460772,mindex-13,start-0.dhtml" target="_blank">查詢</a> </td> </tr> <tr> <td> <a href="/sch/schoolInfo--schId-367881.dhtml" target="_blank"> 北京交通大學 </a> </td> <td>北京</td> <td>教育部</td> <td class="ch-table-center"> <span class="ch-table-tag ch-table-tag-empty"></span> <span class="ch-table-tag">211</span> </td> <td class="ch-table-center"> <i class="iconfont ch-table-tick"></i> </td> <td class="ch-table-center"> </td> <td> <a href="/zxdy/forum--type-sch,forumid-455567,method-listDefault,start-0,year-2014.dhtml" target="_blank">進入</a> </td> <td class="text_center"> <a href="/sch/listZszc--schId-367881,categoryId-10460774,mindex-13,start-0.dhtml" target="_blank">查詢</a> </td> </tr> <tr> <td> <a href="/sch/schoolInfo--schId-367882.dhtml" target="_blank"> 北京工業大學 </a> </td> <td>北京</td> <td>北京市</td> <td class="ch-table-center"> <span class="ch-table-tag ch-table-tag-empty"></span> <span class="ch-table-tag">211</span> </td> <td class="ch-table-center"> </td> <td class="ch-table-center"> </td> <td> <a href="/zxdy/forum--type-sch,forumid-441418,method-listDefault,start-0,year-2014.dhtml" target="_blank">進入</a> </td> <td class="text_center"> <a href="/sch/listZszc--schId-367882,categoryId-10460776,mindex-13,start-0.dhtml" target="_blank">查詢</a> </td> </tr> <tr> <td> <a href="/sch/schoolInfo--schId-367883.dhtml" target="_blank">北京航空航天大學 </a> </td> <td>北京</td> <td>工業與信息化部</td> <td class="ch-table-center"> <span class="ch-table-tag">985</span> <span class="ch-table-tag">211</span> </td> </tbody> </table>
我們可以發現數據是有規律的,每個tr的首個td是學校的名稱,第二個td是院校所在地,第三個td是院校的隸屬,我們需要的信息都有了,應該如何對這些復雜的信息進行一個簡單的清洗呢?
1 #爬取院校信息方法 2 from urllib.request import urlopen 3 import pymysql 4 from urllib.error import HTTPError,URLError 5 from bs4 import BeautifulSoup 6 import re 7 8 #爬取院校信息方法 9 def findSchoolInfo(url): 10 try: 11 html = urlopen(url) 12 except HTTPError as e: 13 return None 14 try: 15 bsObj = BeautifulSoup(html.read(),‘lxml‘) 16 shcoolInfo = bsObj.findAll("table",{"class":"ch-table"}) 17 except AttributeError as e: 18 return None 19 return shcoolInfo 20 21 #處理信息為需要的信息 22 def handleSchoolInfo(info): 23 if info == None: 24 print("沒有院校信息") 25 else: 26 school_list = [] 27 for item in info: 28 list = item.findAll("tr") 29 for x in list: 30 school = x.findAll("td") 31 if len(school) 32 school_list.append(school[0:3]) 33 else: 34 continue 35 for item in school_list: 36 school_name = item[0].get_text().strip() 37 school_shengfen = item[1].get_text() 38 shcool_belong = item[2].get_text() 39 40 shcoolInfo = findSchoolInfo("https://yz.chsi.com.cn/sch/search.do?start=0" 41 handleSchoolInfo(shcoolInfo) 42 print("爬取完成")
在findSchoolInfo方法中我們初步對數據進行了一個處理,使用了findAll來進行了數據的首次爬取,可以看到所需要的表格已經被爬取到了
在handleSchoolInfo方法中同樣使用到了findAll("tr")來對數據進行一個清洗,通過tr的篩選之後,table標簽已經沒有了
同理我們使用findAll("td")來進行td的篩選,同時可以發現一個數據是為空的,因為通過前面tr的篩選的首行信息裏面是th而不是td的
接下來由於只需要每個數據的前三行,所以只需要將前三個數據保存即可,然後將保存的數據進行一個有效數據的剝離
1 school_list.append(school[0:3]) 2 for item in school_list: 3 school_name = item[0].get_text().strip() 4 school_shengfen = item[1].get_text() 5 shcool_belong = item[2].get_text()
但是此時爬取到的數據也僅僅是當前頁的數據,通過分析研招網的鏈接不難得知,每一頁之間的差距僅僅是在最後的參數不同,那麽在爬蟲的URL進行修改即可
https://yz.chsi.com.cn/sch/?start=0
https://yz.chsi.com.cn/sch/?start=20
1 index = 0 2 while index < 44: 3 shcoolInfo = findSchoolInfo("https://yz.chsi.com.cn/sch/search.do?start="+str(index*20)) 4 handleSchoolInfo(shcoolInfo) 5 index+=1
數據庫的連接
使用的數據庫是SQL Server 2012,首先需要的是進行包的安裝與引入使用的是
import pyodbc
安裝參考包的安裝
pyodbc模塊是用於odbc數據庫(一種數據庫通用接口標準)的連接,不僅限於SQL server,還包括Oracle,MySQL,Access,Excel等
連接字符串的編寫
conn = pyodbc.connect(r‘DRIVER={SQL Server Native Client 11.0};SERVER=數據庫的IP地址;DATABASE=需要連接的數據庫名稱;UID=用戶名;PWD=密碼‘)
連接對象的建立
在完成連接字符串之後,我們需要建立連接對象
cursor = conn.cursor()
數據庫連接就已經完成了,接下來就是數據庫的基本操作了
數據寫入到數據庫
上面我們已經找到了需要的數據同時也建立了數據庫的連接,接下來就是將數據插入到數據庫了
1 def insertDB(school_name,school_shengfen,shcool_belong): 2 sql = "INSERT INTO tb_school(school_name,school_shengfen,school_belong) 3 VALUES (‘%s‘, ‘%s‘, ‘%s‘)" % 4 (school_name,school_shengfen,shcool_belong) 5 try: 6 cursor.execute(sql) 7 conn.commit() 8 print(school_shengfen+"\t"+school_name+"添加成功") 9 except: 10 print("插入出錯") 11 conn.rollback()
我們可以看到數據庫內確實已經有數據了
最後關閉數據庫的連接
conn.close()
參考引用:
[1] Ryan Mitchell. Web Scraping with Python[M]. O‘Reilly Media ,2015.
[2] Python連接SQL Server入門
使用python實現簡答的爬蟲