該博客介紹瞭如何使用python爬取西南大學官網2014年-2019年內所有通知和新聞的過程。使用了PyQery,re和time庫,在開始爬取之前先安裝這個好這3個基本庫,推薦使用pip3安裝,因爲是從國外下載,過程可能比較慢,所以如果要學爬蟲強烈推薦使用阿里雲鏡像或者清華大學鏡像,配置好鏡像後,你會發現:下載python庫像飛一樣的快。
開始介紹爬取過程:
先打開網址www.swu.edu.cn,可以看到如下界面:
往下拉,我們可以看到通知,新聞快遞功能,如下圖:
點擊通知,我們就可以看到裏面具體內容,此時鏈接轉爲:http://222.198.125.159/seeyon/xndxBulData.do?method=getMoreTzList&startIndex=12&pageSize=60,
分析鏈接及網頁內容:
在url裏面我們可以得到2個條件,startIndex,pageSize。那麼這2個代表什麼呢,如果細心的你數一下通知裏面的條目數可以發現pageSize代表在所顯示的網頁裏的通知數目,而startIndex代表所瀏覽起始索引數(後面會用到這個參數)。接着,我們在網頁空白處點擊鼠標右鍵,點擊查看源文件(也可以用檢查,然後network),即我們先解析網頁代碼。
我們可以看到裏面內容,
<div class="text"> | |
<div class="title"> | |
西南大學新聞 | |
</div> | |
<div class="list-box"> | |
<ul> | |
<li><span class="rt">2019-03-28</span><a onclick="openWin('/seeyon/xndxNewsData.do?method=userView&id=dUFjdkxvb09VdVlTdXVKdkhxalEreDlQNjdhWDhuOVM=')" href="#" >學校舉行“澳大利亞文學周•重慶站”西南大學專場活動</a></li> | |
</ul>
|
我們發現每個通知都遵循這樣的格式,即<ul><li><a>文章標題</a></li></ul>,所以我們可以先提前文章標題內容,代碼如下:
url="http://222.198.125.159/seeyon/xndxBulData.do?method=getMoreTzList&startIndex=12&pageSize=60"
doc=pq(url)
list_a=doc("ul li a").items()
#list_a=str(list_a)
for k in list_a:
print(k.text())#獲取文本標題信息
所以我們得到該頁面所有文章標題,接下來分析文章裏面內容,我們點擊第一篇文章後轉如另外一個連接(這裏觸發了一個js)
連接變爲了http://222.198.125.159/seeyon/xndxBulData.do?method=userView&id=MUltZVNjaEJnVjQ5Y01QbUQ0eWNCRHVzOVlzcjlJUEc=&t=1554182282319,點擊不同的文章我們可以看到url前部分基本相同,只有id不同,所以想爬取文章具體內容,只需改變id即可。那麼這個id從何而來?又如何知道了,回過頭來看網頁內容,我們發現<a>標籤裏面綁定的事件又ID,onclick="openWin('/seeyon/xndxNewsData.do?method=userView&id=dUFjdkxvb09VdVlTdXVKdkhxalEreDlQNjdhWDhuOVM=',所以我們只需要用正則表達式提取出來就好。代碼如下:
url="http://222.198.125.159/seeyon/xndxBulData.do?method=getMoreTzList&startIndex=12&pageSize=60"
doc=pq(url)
list_a=doc("ul li a").items()
#list_a=str(list_a)
for k in list_a:
#print(k.text())#獲取文本標題信息
#print(type(k.text()))
#print(k.attr('onclick'))
file_name=k.text()
pattern='=.*?=(.*?)='
file_content=re.findall( pattern,k.attr('onclick'))
解析網頁內容
前面我們知道了如何得到每一篇文章標題所所對應的文章內容,我們繼續解析如何提取文章內容,我們可以繼續查看源代碼。發現文章內容在<p>標籤裏面,所以用pyquery庫從裏面提出內容即可:
doc=pq(link)
file_content=doc("p").text()
接下來就是建立文件並保存內容,我把文件夾建在這個目錄下:D:\Spiders_file\project1_SWU_News,由於python對\會報錯,可以加雙斜或者r強制轉換成字符串,我希望用文章標題名作爲文件名。用前面title標籤內容作爲即可.最後保存文件實現代碼如下:
file_path="D:\\Spiders_file\\project1_SWU_News\\"
file_path=file_path+file_name+r'.txt'
file=open(file_path,"a",encoding='utf-8')
file.write(file_content)
file.close()
計算時間:
s=time.time()
main()
e=time.time()
print("完成!!時間爲:{}".format(e-s))
結果:
最後附上源代碼:
from pyquery import PyQuery as pq
import re
import time
'''
#def link_to_save_file(link):
url="http://222.198.125.159/seeyon/xndxBulData.do?method=getMoreTzList&startIndex=12&pageSize=22000"
doc=pq(url)
list_a=doc("ul li a").items()
#list_a=str(list_a)
for k in list_a:
#print(k.text())#獲取文本標題信息
#print(k.attr('onclick'))
file_name=k.text()
pattern='=.*?=(.*?)='
file_content=re.findall( pattern,k.attr('onclick'))
link="http://222.198.125.159/seeyon/xndxBulData.do?method=userView&id="+"".join(file_content)
print(link)
'''
def use_url_get_link_file(url):
#url="http://222.198.125.159/seeyon/xndxBulData.do?method=getMoreTzList&startIndex=12&pageSize=60"
doc=pq(url)
list_a=doc("ul li a").items()
#list_a=str(list_a)
for k in list_a:
#print(k.text())#獲取文本標題信息
#print(type(k.text()))
#print(k.attr('onclick'))
file_name=k.text()
pattern='=.*?=(.*?)='
file_content=re.findall( pattern,k.attr('onclick'))
link="http://222.198.125.159/seeyon/xndxBulData.do?method=userView&id="+"".join(file_content)
parse_a_file(link,file_name)
def parse_a_file(link,file_name):
doc=pq(link)
file_content=doc("p").text()
file_path="D:\\Spiders_file\\project1_SWU_News\\"
file_path=file_path+file_name+r'.txt'
file=open(file_path,"a",encoding='utf-8')
file.write(file_content)
file.close()
print("成功一個文件")
def main():
url="http://222.198.125.159/seeyon/xndxBulData.do?method=getMoreTzList&startIndex=12&pageSize=60"
link=use_url_get_link_file(url)
#link_to_save_file(link)
#print(doc("a"))
if __name__=='__main__':
s=time.time()
main()
e=time.time()
print("完成!!時間爲:{}".format(e-s))