海大官网数据爬取——总结

起始URL

海南大学新闻网

引用包

import requests
import csv
from bs4 import BeautifulSoup
import re

爬虫框架流程

简易流程

问题

  1. 判断主题模块是否存在可爬取对象
  2. 判断文章的容器是否为空
  3. 如何获取文章列表的网页数:找出各模块存在的一致性网页元素——根据其构造URL
  4. 判断文章链接是否为全域名
  5. 数据存储,两种方式:csv分模块存储,数据库存储
  6. 请求流量过多,服务器不响应

在这里插入图片描述

代码(数据库存储)

# 连接数据库
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)
   

你可能感兴趣的:(python,url)