【作业】数据结构化与保存
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