使用python实现简单的爬虫
python爬蟲的簡(jiǎn)單實(shí)現(xiàn)
- 開發(fā)環(huán)境的配置
- python環(huán)境的安裝
- 編輯器的安裝
- 爬蟲的實(shí)現(xiàn)
- 包的安裝
- 簡(jiǎn)單爬蟲的初步實(shí)現(xiàn)
- 將數(shù)據(jù)寫入到數(shù)據(jù)庫(kù)
-簡(jiǎn)單的數(shù)據(jù)清洗
-數(shù)據(jù)庫(kù)的連接
-數(shù)據(jù)寫入到數(shù)據(jù)庫(kù)
開發(fā)環(huán)境配置
python環(huán)境的安裝
python環(huán)境使用的是3.0以上版本
為了便于安裝這里使用的是anaconda
下載鏈接是anaconda
選擇下載64位即可?
?
編輯器的安裝
這里使用pycharm作為python開發(fā)的編輯器,下載網(wǎng)址?pycharm
下載Community社區(qū)版即可?
?
在打開pycharm創(chuàng)建新項(xiàng)目的時(shí)候如下圖所示,那么就代表了環(huán)境已經(jīng)安裝好了?
?
爬蟲的實(shí)現(xiàn)
包的安裝
我們這里使用的爬蟲插件是beautifulsoup不屬于python的基礎(chǔ)庫(kù),所以我們需要另行添加插件,在pycharm添加插件也是非常簡(jiǎn)單的,只需要在file->settings->project->project interpreter添加對(duì)應(yīng)的插件即可?
?
點(diǎn)擊+號(hào)即可選擇需要的python包進(jìn)行安裝?
?
簡(jiǎn)單爬蟲的初步實(shí)現(xiàn)
接下來(lái)就要開始真正的寫爬蟲了
#首先需要引入包 from urllib.request import urlopen from bs4 import BeautifulSouphtml = urlopen("https://www.cnblogs.com/ladyzhu/p/9617567.html")#括號(hào)內(nèi)的是需要爬取的網(wǎng)址地址 bsObj = BeautifulSoup(html.read())print(bsObj.title)?
將數(shù)據(jù)寫入到數(shù)據(jù)庫(kù)
簡(jiǎn)單的數(shù)據(jù)清洗
前面我們已經(jīng)爬取到到了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)的信息,但是這些信息是雜亂無(wú)章的,接下我們已爬取研招網(wǎng)的院校庫(kù)為例,爬取每個(gè)院校的校名、所在地、院校隸屬,學(xué)習(xí)一下如何進(jìn)行一個(gè)簡(jiǎn)單的數(shù)據(jù)處理與爬取。
https://yz.chsi.com.cn/sch/?start=0
我們可以看到整個(gè)界面是十分復(fù)雜的,但是我們可以進(jìn)行一個(gè)分析,我們所需要的數(shù)據(jù)僅僅是最下面的表格內(nèi)的數(shù)據(jù)
?
通過(guò)查看網(wǎng)頁(yè)源碼可以發(fā)現(xiàn),所有的院校信息確實(shí)是保存在下面的一個(gè)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">招生簡(jiǎn)章</th></tr></thead><tbody><tr><td><a href="/sch/schoolInfo--schId-367878.dhtml" target="_blank">北京大學(xué)</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">進(jìn)入</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">中國(guó)人民大學(xué)</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">進(jìn)入</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">清華大學(xué)</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">進(jìn)入</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">北京交通大學(xué)</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">進(jìn)入</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">北京工業(yè)大學(xué)</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">進(jìn)入</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">北京航空航天大學(xué)</a></td><td>北京</td><td>工業(yè)與信息化部</td><td class="ch-table-center"><span class="ch-table-tag">985</span><span class="ch-table-tag">211</span></td></tbody> </table>?
我們可以發(fā)現(xiàn)數(shù)據(jù)是有規(guī)律的,每個(gè)tr的首個(gè)td是學(xué)校的名稱,第二個(gè)td是院校所在地,第三個(gè)td是院校的隸屬,我們需要的信息都有了,應(yīng)該如何對(duì)這些復(fù)雜的信息進(jìn)行一個(gè)簡(jiǎn)單的清洗呢?
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方法中我們初步對(duì)數(shù)據(jù)進(jìn)行了一個(gè)處理,使用了findAll來(lái)進(jìn)行了數(shù)據(jù)的首次爬取,可以看到所需要的表格已經(jīng)被爬取到了?
?
在handleSchoolInfo方法中同樣使用到了findAll("tr")來(lái)對(duì)數(shù)據(jù)進(jìn)行一個(gè)清洗,通過(guò)tr的篩選之后,table標(biāo)簽已經(jīng)沒有了?
同理我們使用findAll("td")來(lái)進(jìn)行td的篩選,同時(shí)可以發(fā)現(xiàn)一個(gè)數(shù)據(jù)是為空的,因?yàn)橥ㄟ^(guò)前面tr的篩選的首行信息里面是th而不是td的?
接下來(lái)由于只需要每個(gè)數(shù)據(jù)的前三行,所以只需要將前三個(gè)數(shù)據(jù)保存即可,然后將保存的數(shù)據(jù)進(jìn)行一個(gè)有效數(shù)據(jù)的剝離
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()?
但是此時(shí)爬取到的數(shù)據(jù)也僅僅是當(dāng)前頁(yè)的數(shù)據(jù),通過(guò)分析研招網(wǎng)的鏈接不難得知,每一頁(yè)之間的差距僅僅是在最后的參數(shù)不同,那么在爬蟲的URL進(jìn)行修改即可
https://yz.chsi.com.cn/sch/?start=0
https://yz.chsi.com.cn/sch/?start=20
?
數(shù)據(jù)庫(kù)的連接
使用的數(shù)據(jù)庫(kù)是SQL Server 2012,首先需要的是進(jìn)行包的安裝與引入使用的是
import pyodbc?
安裝參考包的安裝
pyodbc模塊是用于odbc數(shù)據(jù)庫(kù)(一種數(shù)據(jù)庫(kù)通用接口標(biāo)準(zhǔn))的連接,不僅限于SQL server,還包括Oracle,MySQL,Access,Excel等
連接字符串的編寫
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=數(shù)據(jù)庫(kù)的IP地址;DATABASE=需要連接的數(shù)據(jù)庫(kù)名稱;UID=用戶名;PWD=密碼')?
連接對(duì)象的建立
在完成連接字符串之后,我們需要建立連接對(duì)象
?
數(shù)據(jù)庫(kù)連接就已經(jīng)完成了,接下來(lái)就是數(shù)據(jù)庫(kù)的基本操作了
數(shù)據(jù)寫入到數(shù)據(jù)庫(kù)
上面我們已經(jīng)找到了需要的數(shù)據(jù)同時(shí)也建立了數(shù)據(jù)庫(kù)的連接,接下來(lái)就是將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)了
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("插入出錯(cuò)") 11 conn.rollback()?
我們可以看到數(shù)據(jù)庫(kù)內(nèi)確實(shí)已經(jīng)有數(shù)據(jù)了?
?
最后關(guān)閉數(shù)據(jù)庫(kù)的連接
conn.close()?
參考引用:
[1]?Ryan Mitchell. Web Scraping with Python[M]. O'Reilly Media ,2015.
[2]?Python連接SQL Server入門
轉(zhuǎn)載于:https://www.cnblogs.com/ladyzhu/p/10477785.html
總結(jié)
以上是生活随笔為你收集整理的使用python实现简单的爬虫的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: canvas实现半圆环形进度条
- 下一篇: 017_python常用小技巧