python网络爬虫爬取西南大学官网2014年-2019年内所有通知和新闻

    该博客介绍了如何使用python爬取西南大学官网2014年-2019年内所有通知和新闻的过程。使用了PyQery,re和time库,在开始爬取之前先安装这个好这3个基本库,推荐使用pip3安装,因为是从国外下载,过程可能比较慢,所以如果要学爬虫强烈推荐使用阿里云镜像或者清华大学镜像,配置好镜像后,你会发现:下载python库像飞一样的快。

开始介绍爬取过程:

  先打开网址www.swu.edu.cn,可以看到如下界面:

python网络爬虫爬取西南大学官网2014年-2019年内所有通知和新闻

 

往下拉,我们可以看到通知,新闻快递功能,如下图:

python网络爬虫爬取西南大学官网2014年-2019年内所有通知和新闻

点击通知,我们就可以看到里面具体内容,此时链接转为:http://222.198.125.159/seeyon/xndxBulData.do?method=getMoreTzList&startIndex=12&pageSize=60

python网络爬虫爬取西南大学官网2014年-2019年内所有通知和新闻

分析链接及网页内容:

在url里面我们可以得到2个条件,startIndex,pageSize。那么这2个代表什么呢,如果细心的你数一下通知里面的条目数可以发现pageSize代表在所显示的网页里的通知数目,而startIndex代表所浏览起始索引数(后面会用到这个参数)。接着,我们在网页空白处点击鼠标右键,点击查看源文件(也可以用检查,然后network),即我们先解析网页代码。

 

python网络爬虫爬取西南大学官网2014年-2019年内所有通知和新闻

 

我们可以看到里面内容,

<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))

结果:

 

 

最后附上源代码:

python网络爬虫爬取西南大学官网2014年-2019年内所有通知和新闻

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))