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