内容:
要求:
爬取湖北师范大学校园官网新闻,将其标题,内容,来源和发布时间写入CSV文件中。
分析:
湖北师范大学校园官网新闻网页:由于刚开始爬取可以根据其模块将其慢慢爬取。
爬取摸个面板:
先试着爬取某个面板:(学校要闻)
部分代码:
将光标移到对应的模板可看到其源代码(如下图)可发现在
#爬取模块1下的新闻要闻模块
lilist=doc.find('div',{'class':'xxyw'}).findAll('li');
爬取此模板下的一级参数:(代码如下)
#爬取一级参数
for x in lilist:
Title=x.find('a').text;
Time=x.select('span')[-1].string
Link='http://www.news.hbnu.edu.cn'+x.find('a').get('href')
Link_1=Link
#print(Link)
print(Title)
print(Time)
self.draw_detail_list(Link,Title,Time);
pass
写入CSV文件的方法:
将解析得到的内容(字典格式)逐行写入csv文件:(代码如下)
#将解析得到的内容(字典格式)逐行写入csv文件
def write_dictionary_to_csv(self,dict,filename):
file_name='{}.csv'.format(filename)
with open(file_name, 'a',encoding='utf-8') as f:
file_exists = os.path.isfile(filename)
w =csv.DictWriter(f, dict.keys(),delimiter=',', quotechar='"', lineterminator='\n',quoting=csv.QUOTE_ALL, skipinitialspace=True)
if not file_exists :
w.writeheader()
w.writerow(dict)
print('当前行写入csv成功!')
(爬取整块模板和二级参数方法一样,即查看源代码,然后分析标签下的内容进行解析)
综合代码:
from urllib import request
from bs4 import BeautifulSoup
import csv
import re
import io,os
import os.path
import sys
import sqlite3
import urllib
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
"""爬取核心的核心模块,功能只负责爬取研究生调剂信息"""
Link_1='http://www.news.hbnu.edu.cn'
class DrawStu():
"""docstring for DrawStu"""
def __init__(self):
self.baseurl='http://www.news.hbnu.edu.cn'
db.create_table()
pass
#提取公共的爬取信息的api
def commonsdk(self,url):
print(url)
response=urllib.request.urlopen(url)#注意 写在内部以后 变成了形参
html=response.read()#read进行乱码处理
# print(html)
doc=BeautifulSoup(html,'lxml')
return doc
#爬取基本列表
def draw_base_list(self,url):
print('url is:::',url);
doc=self.commonsdk(url);
# lilist=doc.find('div',{'id':'container'}).findAll('li');
#爬取模块1下的新闻要闻模块
lilist=doc.find('div',{'class':'xxyw'}).findAll('li');
#爬取模块2的新闻
lilist_1=doc.find('div',{'class':'mod2'}).findAll('li');
#print(lilist);
#爬取一级参数
for x in lilist:
Title=x.find('a').text;
Time=x.select('span')[-1].string
Link='http://www.news.hbnu.edu.cn'+x.find('a').get('href')
Link_1=Link
#print(Link)
print(Title)
print(Time)
self.draw_detail_list(Link,Title,Time);
pass
for x in lilist_1:
Title=x.find('a').text;
Time=x.select('span')[-1].string
Link='http://www.news.hbnu.edu.cn'+x.find('a').get('href')
Link_1=Link
#print(Link)
print(Title)
print(Time)
self.draw_detail_list(Link,Title,Time);
pass
pass
#将解析得到的内容(字典格式)逐行写入csv文件
def write_dictionary_to_csv(self,dict,filename):
file_name='{}.csv'.format(filename)
with open(file_name, 'a',encoding='utf-8') as f:
file_exists = os.path.isfile(filename)
w =csv.DictWriter(f, dict.keys(),delimiter=',', quotechar='"', lineterminator='\n',quoting=csv.QUOTE_ALL, skipinitialspace=True)
if not file_exists :
w.writeheader()
w.writerow(dict)
print('当前行写入csv成功!')
#爬取二级详情的信息参数
def draw_detail_list(self,url,Title,Time):
doc=self.commonsdk(url);
from_info=doc.find('span',{'class':'arti_publisher'}).text;
content=doc.find('div',{'class':'wp_articlecontent'}).text;
#将数据 拼合成字典 交给数据库存储的api
data={
'Title':Title,
'Content':content,
'PublishTime':Time,
'Origin':from_info
}
print(data);
# print('插入数据库中');
# db.insert_into_news(data);
# 存储到csv文件
self.write_dictionary_to_csv(data,'xinwen')
pass
class DB(object):
"""数据库访问方法的实现"""
"""初始化api 产生数据操作的对象 conect 操作的游标"""
def __init__(self):
self.conn={};
self.cus={};
#初始化数据库链接的api
#1产生数据库链接对象
self.conn=sqlite3.connect(r'xinwen.db');
#2.产生操作的游标
self.cus=self.conn.cursor();
pass;
def create_table(self):
sql = " CREATE TABLE if not exists mynews (Title char,Content char,PublishTime char,Origin char)"
self.conn.execute(sql)
self.conn.commit()
print('create table successfully')
def insert_into_news(self,ops):
self.conn.execute('insert into mynews(Title,Content,PublishTime,Origin) values(?,?,?,?)',(ops['Title'],ops['Content'],ops['PublishTime'],ops['Origin'],));
self.conn.commit();
pass
db=DB()
draw=DrawStu()
if __name__ == '__main__':
print('爬取湖北师范大学校园新闻')
draw.draw_base_list(Link_1)
pass
运行后写入到CSV文件: