海大官网数据爬取——总结
程序员文章站
2021-12-29 11:52:07
起始URL海南大学新闻网引用包import requestsimport csvfrom bs4 import BeautifulSoupimport re爬虫框架流程简易流程问题判断主题模块是否存在可爬取对象判断文章的容器是否为空如何获取文章列表的网页数:找出各模块存在的一致性网页元素——根据其构造URL判断文章链接是否为全域名各模块文章分开存储请求流量过多,服务器不响应代码# coding:utf-8import requestsimport csvfrom...
起始URL
引用包
import requests
import csv
from bs4 import BeautifulSoup
import re
爬虫框架流程
问题
- 判断主题模块是否存在可爬取对象
- 判断文章的容器是否为空
- 如何获取文章列表的网页数:找出各模块存在的一致性网页元素——根据其构造URL
- 判断文章链接是否为全域名
- 数据存储,两种方式:csv分模块存储,数据库存储
- 请求流量过多,服务器不响应
代码(数据库存储)
# 连接数据库
def conn(ip, id, pw, db):
connect = pymssql.connect(ip, id, pw, db)
# 建立游标
cursor = connect.cursor()
print('连接成功')
return connect, cursor
# 连接数据库,建立数据库中的表结构
connect, cursor = conn('localhost', 'shetuan_lhc', '1176313802', 'HainuNews')
sql_0 = "drop table news"
sql_1 = "create table news ( Title char(500) null,Date date null,URL char(500) null)"
cursor.execute(sql_0)
cursor.execute(sql_1)
connect.commit()
sql_2 = "insert into news(Title,Date,URL) values(%s,%s,%s)"
list_1 = (News_title, News_date, News_url)
# 执行sql语句
cursor.execute(sql_2, list_1)
# 提交到数据库执行
connect.commit()
代码(csv存储)
# coding:utf-8
import requests
import csv
from bs4 import BeautifulSoup
import re
def get_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/84.0.4147.89 Safari/537.36 '
}
html=requests.get(url,headers=headers)
html.encoding = html.apparent_encoding
bs=BeautifulSoup(html.text,'html.parser')
return bs
def store_csv(topic,lists):
# 为该类构造一个csv文件
csv_file = open(topic+'.csv','w',newline='',encoding='utf-8')
writer = csv.writer(csv_file)
writer.writerow(['标题', '日期', '链接'])
for list in lists:
writer.writerow(list)
print(topic+'写入完成')
csv_file.close()
root_url = 'http://ha.hainanu.edu.cn/vnew/'
bs_URLS = get_page(root_url)
# 获取所有主题类
results_URLS=bs_URLS.find('div',class_='news-nav demonews-nav fixed').find_all('a')
pages = []
for result_url in results_URLS:
pages = []
# 爬取文章的主题分类名
string = result_url['href'].replace('.htm', '')
Topic_title = result_url['title']
print('\n开始爬 '+Topic_title+'类')
# 构造各主题类的URL
result_url = root_url + result_url['href']
# 获取改主题区的文章的网页页数
bs_1 = get_page(result_url)
try:
href = bs_1.find('span',class_='p_next p_fun').find('a')['href']
except AttributeError as e:
print(Topic_title + '类未找到')
continue
Num_page = int(re.sub('\D','',href)) + 1
num = Num_page
print(Topic_title+'类 有'+str(Num_page)+'页')
# 构造除首页外其他的文章网页,放入pages列表中
pages.append(result_url)
# 每个主题类最多爬取21页
while Num_page >=1 and Num_page >= num-20:
# 建造网页
URL = root_url+string+'/'+str(Num_page)+".htm"
Num_page-=1
pages.append(URL)
# 为每一个主题类建立一个数据列表
real_datas = []
# 开始爬取文章
for url in pages:
bs = get_page(url)
try:
results = bs.find('div',class_='news-list2').find_all('a')
except AttributeError as e:
print(Topic_title + '类新闻列表未找到')
break
for result in results:
part_result = result['href'].replace('..','')
# 有些URL会出现全域名
if "http" in part_result:
News_url = part_result
else:
News_url = root_url+part_result
News_title = result['title']
News_date = result.find('span').get_text()
list = [News_title,News_date,News_url]
real_datas.append(list)
store_csv(Topic_title,real_datas)
本文地址:https://blog.csdn.net/qq_45612184/article/details/107666017