文化馆网站建设方案,腾讯企业邮箱手机登录入口,建筑人才网市场,公司加盟目标网站#xff1a;湖南法治报 爬取目的#xff1a;为了获取某一地区更全面的在湖南法治报的已发布的和优化营商环境相关的宣传新闻稿#xff0c;同时也让自己的工作更便捷 环境#xff1a;Pycharm2021#xff0c;Python3.10#xff0c; 安装的包#xff1a;requests湖南法治报 爬取目的为了获取某一地区更全面的在湖南法治报的已发布的和优化营商环境相关的宣传新闻稿同时也让自己的工作更便捷 环境Pycharm2021Python3.10 安装的包requestscsvbs4datetime v3.0 版本特点从控制台输入时间段与搜索关键词获取指定时间段的新闻数据筛选出含有想要查找的的关键词的新闻内容同时标注新闻是否和优化营商环境相关粗略判断新闻是否和优化营商环境相关并存储起来。 1 首先分析网页
查看数据返回方式发现网站不用像红网那样设置各种headers了可以直接爬
发现在这个页面只有文章标题和发布时间以及文章链接的信息当然文章有图片的就还有图片信息 2 再看文章内容页面
像我就只要文字部分就行了不需要图片 3 修改的主要代码粗略判断新闻是否和优化营商环境相关 4 运行结果 爬虫 新闻网站 以湖南法治报为例含详细注释控制台版 V3.0 升级 自定义查询关键词、时间段、粗略判断新闻是否和优化营商环境相关避免自己再一个个判断 5 完整代码详细注释
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Time : 2024/4/6 15:36
# Author : LanXiaoFang
# Site :
# File : efaw_v3.py
# Software: PyCharm
# V3版本主要是增加二级搜索可以是在市州动态下某一地区的新闻再搜索这一地区新闻内容中满足含有某些关键词的新闻比如零陵的新闻中内容含有和优化营商环境有关的新闻
import csv
import datetime
import requests
from bs4 import BeautifulSoup# 由于发现湖南法治报没有设置反爬机制因为我们不用反反爬了可以直接爬数据了
# 市州动态 下的对应市州的编号
szId {长沙: 14129, 株洲: 14130, 湘潭: 14223, 衡阳: 14224, 邵阳: 14225, 岳阳: 14226,常德: 14227,张家界: 14228, 益阳: 14229, 郴州: 14230, 永州: 14231, 怀化: 14232, 娄底: 14233,湘西: 14234}# 输入你想要获取的湖南省下的哪一市州的新闻 比如 湖南省下的永州市直接输入 永州 即可
sz 永州
# 根据输入的湖南省下的市州 得到对应的市州编号 再拼接入链接
url http://www.efaw.cn/list/ szId[sz]
# 输入你想要的关键词 比如 双牌、蓝山、宁远、新田、零陵
# search_keyword 双牌
print(输入你想要的关键词 比如 双牌、蓝山、宁远、新田、零陵)
search_keyword input(输入你想要的关键词:)
# 二级搜索 目前只设定了三个词后续有时间优化一下这部分
search_keyword2 [优化, 营商, 环境]
# 标题就含有关键词的计数器
title_Yes_Num 0
# 标题不含有关键词但是内容含有关键词的计数器
title_No_Num 0
# 新闻来源级别
level 省级
# 自定义需要获取的新闻的时间段
print(自定义需要获取的新闻的时间段 格式如 2024 3 1)
# 开始时间
# start_time 2024 3 1
start_time input(请输入开始时间)
start_time datetime.datetime.strptime(start_time, %Y %m %d)
# 截止时间
# end_time 2024 4 6
end_time input(请输入截止时间)
end_time datetime.datetime.strptime(end_time, %Y %m %d)
# 用于计数爬到第几个新闻
count_cc 0爬虫思路
首先最开始是打开要爬取的网站然后分析怎样获取需要的数据最完整和便捷
一开始看到搜索其实是想直接搜关键词获取新闻的但是发现通过搜索框获得到新闻数据不如市州动态下的全面
所以还是打算一条一条新闻比对是否符合自定义关键词
1 首先进入市州动态获取到某市州动态下的所有新闻数据
2 根据具体新闻链接进入新闻页面获取到新闻信息
# # 创建CSV文件并写入头部信息
with open(search_keyword yhyshj_湖南法治报_标题含关键词.csv, w, newline, encodingutf-8) as csvfile:writer csv.writer(csvfile)writer.writerow([序号, 新闻名称, 新闻来源, 媒体级别, 发布日期, 原文链接, 来源, 优化营商环境相关]) # 根据实际情况定义列名
with open(search_keyword yhyshj_湖南法治报_内容含关键词.csv, w, newline, encodingutf-8) as csvfile:writer csv.writer(csvfile)writer.writerow([序号, 新闻名称, 新闻来源, 媒体级别, 发布日期, 原文链接, 来源, 优化营商环境相关]) # 根据实际情况定义列名# http://www.efaw.cn/list/14231?page1
page 1
# while page 20: # 从这里修改数字以控制要多少页的新闻内容,page20page从1开始一直到20
while page 0:# 拼接出每一页的urlurl_page url ?page str(page)html_all requests.get(url_page)html_all.encoding utf-8print(page, 页, url_page)if html_all.status_code 200:soups BeautifulSoup(html_all.text, html.parser)article_info soups.find_all(ul, class_list_content)for i in article_info:result_info i.find_all(div)for art in result_info:article_href art.a.get(href) # 文章链接# print(article_href)article_title art.a.get(title) # 文章标题article_time art.i.text # 文章发布时间 显示为发布时间2024-04-02 10:08:03# 因为只要年月日部分的时间因此把一些不需要的字符去掉article_time article_time[2 article_time.index(间):]article_time article_time[:article_time.index(:) - 3]article_time article_time.replace(-, .)article_time_se datetime.datetime.strptime(article_time, %Y.%m.%d)count_cc 1# print(--page, page, count_cc, count_cc, --title:, article_title, time:, article_time, href:,# article_href)# 设立一个标识默认为0和营商环境无关1有关yshj 0# 现在有个问题怎么退出循环时间不满足就退出现在获取到的新闻的时间开始时间就退出if article_time_se start_time:page -1break# 只把时间满足要求的数据才继续下面的操作 并把数据存入表格if start_time article_time_se end_time:# 从文章内容中获取到来源html_article_info_sk requests.get(article_href)html_article_info_sk.encoding utf-8if html_article_info_sk.status_code 200:soups_sk BeautifulSoup(html_article_info_sk.text, html.parser)# article_info_sk:文章的相关内容包括标题、发表时间、来源、编辑、作者、文章内容article_info_sk soups_sk.find_all(div, class_video_left)# 其实在这里我想获取到具体的来源这一段因为在新闻详情页面如果 来源 为 双牌县优化办 那么这条新闻就是优化办推过去的spxq_title_source soups_sk.find(div, class_spxq_title_source).text# 文章信息来源 显示为 来源湖南法治报atricle_source spxq_title_source[spxq_title_source.index(来源) 3:spxq_title_source.index(|)]article_info_sk_string str(article_info_sk) # 这里要把article_info_sk字符串化不然无法判断关键词是否在内容中存在# 判断search_keyword2中关键词是否在article_info_sk内容中存在if search_keyword2[0] in article_info_sk_string or search_keyword2[1] in article_info_sk_string or \search_keyword2[2] in article_info_sk_string:print(----和优化营商环境有关----)yshj 1# 在这里可以从标题判断是否含有搜索的关键词search_keyword如果有则可以直接存储这条新闻信息如果没有则继续查看新闻内容看是否含有关键词信息if search_keyword in article_title: # 标题判断含有搜索的关键词search_keywordprint(article_info_sk)title_Yes_Num 1with open(search_keyword yhyshj_湖南法治报_标题含关键词.csv, a, newline,encodingutf-8) as csvfile:writer csv.writer(csvfile)writer.writerow([title_Yes_Num, article_title, 湖南法治报, level, article_time, article_href,atricle_source, yshj])# print(Yes Tile have SK !!!!!, title_Yes_Num)print(title_Yes_Num, --title:, article_title, time:, article_time, href:, article_href,source:, atricle_source)else: # 标题判断不含搜索的关键词search_keywordif search_keyword in article_info_sk:title_No_Num 1with open(search_keyword yhyshj_湖南法治报_标题不含内容含关键词.csv, a, newline,encodingutf-8) as csvfile:writer csv.writer(csvfile)writer.writerow([title_No_Num, article_title, 湖南法治报, level, article_time, article_href,atricle_source, yshj])# print(Yes Content have SK !!!!!, article_info_sk)print(title_No_Num, --title:, article_title, time:, article_time, href:, article_href,source:, atricle_source)page 1print(#### 你获取的关键词, search_keyword, 时间从, start_time, ~, end_time, 的数据已经获取完)