【作业】爬虫所有校园新闻

1、完成所有校园新闻的爬虫

(1)获取单条新闻的#标题#链接#时间#来源#内容 #点击次数,并包装成一个函数。

(2)获取一个新闻列表页的所有新闻的上述详情,并包装成一个函数。

(3)获取所有新闻列表页的网址,调用上述函数。

(4)完成所有校园新闻的爬取工作。

 1 #广州商学院新闻爬虫
 2 import requests
 3 import re
 4 from bs4 import BeautifulSoup
 5 from datetime import datetime
 6 
 7 webs = "http://news.gzcc.cn/html/xiaoyuanxinwen/"
 8 res = requests.get(webs)
 9 res.encoding = 'utf-8'  #编码转换,避免中文乱码输出
10 soup = BeautifulSoup(res.text,"html.parser")  #html.parser是指定解析器
11 
12 #函数功能:获取网页的页数
13 def getpage():
14     lists = int(soup.select('.a1')[0].text.rstrip("")) #获取新闻的总条数
15     page = lists//10+1  #计算获取新闻的页数,每页新闻有10条记录
16     return page
17 
18 #函数功能:输出新闻的详细内容
19 def getdetail(url_detail):
20     resd =requests.get(url_detail)
21     resd.encoding = 'utf-8'
22     soupd = BeautifulSoup(resd.text,'html.parser')
23     return (soupd.select('.show-content')[0].text)
24 
25 #函数功能:输出新闻的时间,类型为datetime
26 def gettime(url_time):
27     resd = requests.get(url_time)
28     resd.encoding = 'utf-8'
29     soupd = BeautifulSoup(resd.text,'html.parser')
30     tx1 = soupd.select('.show-info')[0].text
31     tx2 = "{0:.24}".format(tx1[5:24])
32     time1 = datetime.strptime(tx2,'%Y-%m-%d %H:%M:%S') #把字符串类型转换成时间类型
33     return time1
34 
35 #函数功能:输出新闻的点击次数,类型为int
36 def getclick(url_click):
37     id = re.search('_(.*).html',url_click).group(1).split("/")[1]
38     #用正则表达式进行搜索匹配,并返回第一次匹配成功的结果元组,最后用/将元组分开进行取值
39     url_num = ('http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80'.format(id))
40     #将获取到的网页id值填入该页面
41     click = int(requests.get(url_num).text.split('.')[-1].lstrip(".html('").rstrip("');"))
42     #获取页面内容后用点号进行元组内容分隔,然后去掉前后的一些匹配内容后取得点击数的值
43     return click
44 
45 #函数功能:输出新闻的相关信息
46 def shownews(url):
47     res = requests.get(url)
48     res.encoding = 'utf-8'
49     soup = BeautifulSoup(res.text,'html.parser')    
50     for news in soup.select('li'):
51         if len(news.select('.news-list-title'))>0:
52         #如果存在新闻列表标题的话(有内容则会大于0)
53             title = news.select('.news-list-title')[0].contents[0]
54             #输出标题的内容
55             sorce = news.select('.news-list-info')[0].contents[1].text
56             #用列表列出子标签后取出第二个元素的内容(来源)
57             newsurl = news.select('a')[0]['href']
58             #输出a标签中的href内容(即网址)                                        
59             time=news.select('.news-list-info')[0].span.text
60             #用列表列出子标签后取出第一个元素的内容(时间)                    
61             detail = getdetail(newsurl)
62             #输出详细内容            
63             clicknum = getclick(newsurl)
64             #输出点击次数           
65             print(title,'\n','发布时间:',time,'来源:',sorce,'点击次数:',clicknum,'\n','网站链接:',newsurl,'\n',detail)
66             #输出新闻标题、时间、来源、点击次数、链接和内容
67             
68 shownews(webs)    #输出新闻的第一页
69 for i in range(2,getpage()+1):    #循环输出往后的页
70     url_nextnew = ('http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html'.format(i))
71     shownews(url_nextnew)

(由于内容过多,只展示前两页的标题等内容列表和其中一个新闻的完整信息)

 

2、完成自己所选其他主题相应数据的爬取工作。

 

posted @ 2017-10-12 17:42  27杨华星  阅读(631)  评论(0编辑  收藏  举报