1. 程式人生 > >使用python實現簡答的爬蟲

使用python實現簡答的爬蟲

exec 清華大學 read 開發 編輯器 行修改 pro www. ima

python爬蟲的簡單實現

  • 開發環境的配置
    • python環境的安裝
    • 編輯器的安裝
  • 爬蟲的實現
    • 包的安裝
    • 簡單爬蟲的初步實現
    • 將數據寫入到數據庫
      -簡單的數據清洗
      -數據庫的連接
      -數據寫入到數據庫

開發環境配置

python環境的安裝

python環境使用的是3.0以上版本
為了便於安裝這裏使用的是anaconda
下載鏈接是anaconda
選擇下載64位即可 技術分享圖片

技術分享圖片

編輯器的安裝

這裏使用pycharm作為python開發的編輯器,下載網址 pycharm

下載Community社區版即可 技術分享圖片

技術分享圖片

在打開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(rDRIVER={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實現簡答的爬蟲