python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

環境:(私信小編007即可獲取大量Python視頻教程以及PDF!)

Python 3

模塊:

Lxml

Request

Beautifulsoup

開始:

python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

這裡有一個目錄:我們點擊第一個北京市,就可以看到其中的表格,和北京市所有的大學名字

我們的目標就是吧每一個城市的所有大學,分別放在不同的txt文本中。

python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

正式開始分析:

我們審查元素,我們要取的目標為學校名稱

python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

可以清晰的看到網頁的結構,我們要取的目標在一個tbodyz中,並在一個tr標籤內。繼續分析下一個名字找到他們的規律

python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

可以看到每個名字都在一個單獨的tr標籤中。

好我們在看一下這個北京市的url和第二個城市網頁對應的url。

http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-2.html
http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-3.html

可以看到最後的數字不同,從二開始。依次增加。好我們已經基本獲得了目標的信息,下面我們開始激動人心的敲代碼。

我們先從一頁開始。

#coding=utf-8
import requests
import lxml
from bs4 import BeautifulSoup as bs #導入我們的BF,並且命名為bs,名字太長了偷個懶。
def school(): #定義一個函數
url="http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-2.html"
r=requests.get(url=url) #利用requests請求我們的目標網站。
soup=bs(r.content,"lxml")#利用beautifulsoup解析,將返回內容賦值給soup
print (soup) #打印出內容。
if __name__ == '__main__': #程序開始運行的地方,需要調用剛才設置的函數,不然程序是不會運行的。
school()

寫完之後點一下運行,成功返回發現並不需要設置頭信息。省去了一些麻煩。

python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

現在我們開始取內容:

我們的內容在

這個標籤中,我們以這個標籤為標準,查找所有的這個標籤中的內容。代碼是這樣的。運行
def school(): url="http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-2.html"
r=requests.get(url=url)
soup=bs(r.content,"lxml") content=soup.find_all(name="tr",attrs={"height":"29"})
print(content)
python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

Ok 成功返回了我們需要的東西,但是有很多其他沒有用的選項,現在我們要去掉這些東西。繼續編輯school函數。我們需要用循環遍歷我們的取出的內容。讓每一個tr標籤中的內容作為一個獨立的列表,然後利用find_all方法找出而每一個td標籤為list中的內容,方便我們取參數。學校名稱位於第二個td標籤中,在list中的位置則為1.代碼如下。

def school(): url="http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-2.html"
r=requests.get(url=url) soup=bs(r.content,"lxml") content=soup.find_all(name="tr",attrs={"height":"29"})
for content1 in content:
soup_content=bs(str(content1),"lxml")

soup_content1=soup_content.find_all(name="td")
print(soup_content1[1])
python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

加好之後我們運行代碼。發現報錯了,不慌我們看一下報錯的內容

報錯大意為列出索引超出範圍。但是我們發現還是成功返回了一個內容,我們再去分析一下網頁源代碼。

python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

可以看到前三個tr標籤,我們成功的取到了第一個tr標籤中的”學校名稱”這行的內容,然後第二個tr報錯。我們的代碼打印的的是list的第二個內容,但是在第二個tr標籤中只有一個內容。然後剩下的都恢復了正常,我們怎麼解決這個問題呢。可以用python的異常處理。當他報錯時,然後忽略錯誤繼續運行。把代碼變成這樣。

def school():
url="http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-2.html"
r=requests.get(url=url)
soup=bs(r.content,"lxml")
content=soup.find_all(name="tr",attrs={"height":"29"})
for content1 in content:
try: soup_content=bs(str(content1),"lxml") soup_content1=soup_content.find_all(name="td")
print(soup_content1[1])
except IndexError:
pass

再次運行。

python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

成功了,但這只是一個城市,我們還需要其他的。接下來我們需要用一個for循環,從2到33,每次加1,並修改url中的控制頁面的參數中。

#coding=utf-8
import requests
import lxml
from bs4 import BeautifulSoup as bs
def school():
for i in range(2,34,1):
url="http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-%s.html"%(str(i))
r=requests.get(url=url)
soup=bs(r.content,"lxml")
content=soup.find_all(name="tr",attrs={"height":"29"})
for content1 in content:
try:
soup_content=bs(str(content1),"lxml")
soup_content1=soup_content.find_all(name="td")
print(soup_content1[1])
except IndexError:
pass
if __name__ == '__main__':
school()
python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

我們可以看到不僅有北京的學校,還有天津的,當然下面所有的學校都打印出來了。我們還要去掉標籤。修改打印為如下代碼,這樣就只會看到文本。

print(soup_content1[1].string)

主要功能就寫完了,我們還需要,將他們分別存放在不同的文件夾內並保持為特定的文件名,當然我們不可能手動輸入每個城市的名字。還記的我們剛才報錯的地方嗎,那個地方剛剛好有我們要的城市名稱。理一下思路,我們首先從網頁中取出城市名稱,並新建一個對應城市名稱的TXT文本,然後把我們取得的內容分別放入不同的文件內。為了防止報錯停止,我們再加一個異常處理好讓我們繼續把我們的代碼寫完。

def school():
for i in range(2,34,1):
try:
url="http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-%s.html"%(str(i))
r=requests.get(url=url)
soup=bs(r.content,"lxml")
content2=soup.find_all(name="td",attrs={"colspan":"7"})[0].string
f1=open("%s.txt"%(content2),"w")
content=soup.find_all(name="tr",attrs={"height":"29"})
for content1 in content:
try:
soup_content=bs(str(content1),"lxml")
soup_content1=soup_content.find_all(name="td")
f1.write(soup_content1[1].string+"/n")
print(soup_content1[1].string)
except IndexError:
pass
except IndexError:

pass
python黑客快速編寫信息收集器,收錄各省份大學的錄取信息!

完整python代碼:

#coding=utf-8
import requests
import lxml
from bs4 import BeautifulSoup as bs
def school():
for i in range(2,34,1):
try:
url="http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-%s.html"%(str(i))
r=requests.get(url=url)
soup=bs(r.content,"lxml")
content2=soup.find_all(name="td",attrs={"colspan":"7"})[0].string
f1=open("%s.txt"%(content2),"w")
content=soup.find_all(name="tr",attrs={"height":"29"})
for content1 in content:

try:
soup_content=bs(str(content1),"lxml")
soup_content1=soup_content.find_all(name="td")
f1.write(soup_content1[1].string+"/n")
print(soup_content1[1].string)
except IndexError:
pass
except IndexError:
pass
if __name__ == '__main__':
school()

總結:

這個程序的難度並不大,也沒有用什麼多線程,類,非常的簡單,並不一定是代碼越多的程序越好,有的時候我們只是想快速的完成我們的要實現的目標,這時候代碼就要越簡潔越好。希望可以給初學者一些好的學習思路,最後我之所以要再加一個異常處理,是因為又出現了一個和上面一樣的報錯,而為了快速實現我們的目標,我直接嘗試添加一個異常處理,程序正常運行。最後,寫的不好的地方,希望大家多多指點。


分享到:


相關文章: