【作业】数据结构化与保存

1、结构化

  • 单条新闻的详情字典:news
  • 一个列表页所有单条新闻汇总列表:newsls.append(news)
  • 所有列表页的所有新闻汇总列表:newstotal.extend(newsls)

2、转换成pandas的数据结构DataFrame

3、从DataFrame保存到excel

4、从DataFrame保存到sqlite3数据库

 1 #广州商学院新闻爬虫_2017.10.19
 2 import requests
 3 import re
 4 import pandas
 5 import sqlite3
 6 from bs4 import BeautifulSoup
 7 from datetime import datetime
 8 
 9 #函数功能:输出新闻的点击次数,类型为int
10 def getclick(url_click):
11     id = re.search('_(.*).html',url_click).group(1).split("/")[1]
12     #用正则表达式进行搜索匹配,并返回第一次匹配成功的结果元组,最后用/将元组分开进行取值
13     url_num = ('http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80'.format(id))
14     #将获取到的网页id值填入该页面
15     click = int(requests.get(url_num).text.split('.')[-1].lstrip(".html('").rstrip("');"))
16     #获取页面内容后用点号进行元组内容分隔,然后去掉前后的一些匹配内容后取得点击数的值
17     return click
18 
19 #函数功能:输出新闻的相关信息
20 def getdetail(url):
21     resd = requests.get(url)
22     resd.encoding = 'utf-8'
23     soupd = BeautifulSoup(resd.text,'html.parser')
24     news = {} #创建一个字典,存储新闻细节
25     news['title'] = soupd.select('.show-title')[0].text
26     news['url'] = url
27     info = soupd.select('.show-info')[0].text
28     news['source'] = re.search('来源:(.*)点击',info).group(1).strip()
29     news['time'] = datetime.strptime(info.lstrip('发布时间:')[0:19],'%Y-%m-%d %H:%M:%S')
30     #news['content'] = soupd.select('.show-content')[0].text.strip()
31     news['click'] = getclick(url)
32     return news
33 
34 def onepage(url_page):
35     res = requests.get(url_page)
36     res.encoding = 'utf-8'
37     soup = BeautifulSoup(res.text,'html.parser')
38     newsls = [] #创建一个元组
39     for news in soup.select('li'):
40         if len(news.select('.news-list-title'))>0:
41             newsls.append(getdetail(news.select('a')[0]['href']))#一个新闻的字典
42     return newsls
43 #print(onepage('http://news.gzcc.cn/html/xiaoyuanxinwen/'))
44 newstotal = []
45 url_gzcc = 'http://news.gzcc.cn/html/xiaoyuanxinwen/'
46 newstotal.extend(onepage(url_gzcc))  #新闻列表首页
47 
48 res = requests.get(url_gzcc)
49 res.encoding = 'utf-8'
50 soup = BeautifulSoup(res.text,'html.parser')
51 n = int(soup.select('.a1')[0].text.rstrip(''))
52 pages = n//10+1
53 
54 for i in range(2,3):
55     url_list = 'http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html'.format(i)
56     newstotal.extend(onepage(url_list))  #后面的每一个列表页
57 
58 #print(len(newstotal))
59 
60 df = pandas.DataFrame(newstotal)  #转换成表格型数据(DataFrame型)
61 #df.to_excel('gzccnesw.xlsx')  #以Excel表的形式保存数据
62 
63 with sqlite3.connect("gzccnewsdb.sqlite") as db:  #以数据库形式保存,数据库名为gzccnewsdb.sqlite
64     df.to_sql('gzccnewsdb8',con = db)   #表名为gzccnewsdb8

 

posted @ 2017-10-19 10:48  27杨华星  阅读(167)  评论(0编辑  收藏  举报