python網絡爬蟲爬取西南大學官網2014年-2019年內所有通知和新聞

    該博客介紹瞭如何使用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))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章