目录✨博文作者 wangzirui32
喜欢的可以 点赞 收藏 关注哦~~
我的第159篇原创作品
本文首发于CSDN,未经许可禁止转载
hello,大家好,我是wangzirui32,今天我们来学习如何爬取疫情数据和资讯生成网页,开始学习吧!
- 1. 项目结构及准备
- 2. 爬虫思路
- 2.1 分析资讯网页
- 2.2 API接口
- 3.编写代码
- 3.1 get_news函数
- 3.2 get_data函数
- 3.3 app.py
- 3.4 news_template.html 模板
app.py为主程序,用来生成网页,data.py用来爬取资讯和数据,news_template.html为信息网页的模板,news.html为程序运行之后生成的网页。
需要安装的包(命令):
pip install jinja2 BeautifulSoup4 selenium
注:selenium需要浏览器驱动,可以去对应浏览器的官网下载。
2. 爬虫思路我们需要通过selenium控制浏览器对新浪网的资讯进行抓取,通过访问API接口获取今日信息,然后整合成网页。
2.1 分析资讯网页这里的资讯来源于新浪网,访问搜索首页,获取Xpath路径:
搜索框的Xpath为:
//*[@id="tabc02"]/form/div/input[1]
搜索按钮的Xpath为:
//*[@id="tabc02"]/form/div/input[4]
接下来,搜索关键字,HTML网页分析如下:
可以看到,所有的新闻都保存在class属性为box-result clearfix的div标签中,其中的第一个a标签为新闻的链接和标题,下面的span标签保存了作者和发布时间。
下一页按钮的Xpath为:
//*[@id="_function_code_page"]/a[last()]
分析完成后即可编写代码。
2.2 API接口数据API接口网址:https://c.m.163.com/ug/api/wuhan/app/data/list-total,返回数据示例:
依据需要获取即可。
打开data.py,编写get_news函数:
from selenium.webdriver import Edge # 我使用的是Edge浏览器
from bs4 import BeautifulSoup as bs
import requests
def get_news():
print("Requesting data ......")
page = 5 # 5页新闻
url = "https://search.sina.com.cn/news"
html = []
# Edge浏览器驱动位置
driver = Edge(r"D:msedgedriver.exe")
driver.get(url)
# 输入关键词
driver.find_element_by_xpath('//*[@id="tabc02"]/form/div/input[1]').send_keys("疫情")
# 点击搜索按钮
driver.find_element_by_xpath('//*[@id="tabc02"]/form/div/input[4]').click()
for _ in range(page):
# 获取当前页的源代码
html.append(driver.page_source)
# 点击“下一页”
driver.find_element_by_xpath('//*[@id="_function_code_page"]/a[last()]').click()
driver.close()
print("Requested successfully.")
articles = []
print("Parsing data ......")
# 解析网页
for h in html:
soup = bs(h, "html.parser")
div_list = soup.find_all("div", https://blog.csdn.net/wangzirui32/article/details/{"class": "box-result clearfix"})
for div in div_list:
title = div.find("h2").text
link = div.find("a").get("href")
temp = div.find("span", https://blog.csdn.net/wangzirui32/article/details/{"class": "fgray_time"}).text.split()
author = temp[0]
create_time = ' '.join(temp[1:])
# 生成字典
news = https://blog.csdn.net/wangzirui32/article/details/{
"title": title,
"link": link,
"author": author,
"create_time": create_time
}
# 防止重复
if not (news in articles): articles.append(news)
print("Parsed successfully.")
return articles
3.2 get_data函数
打开data.py,编写get_data函数用来获取API数据,代码:
def get_data():
url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total"
headers = https://blog.csdn.net/wangzirui32/article/details/{
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
}
data = requests.get(url, headers=headers).json().get("data").get("chinaTotal")
return data
3.3 app.py
app.py代码如下:
from jinja2 import Template
import datetime
from data import get_data, get_news
def render_template(news, data):
try:
with open("news_template.html", encoding="utf-8") as f:
template = f.read()
except Exception:
return
print("Rendering news template ......")
news_template = Template(template)
render_html = news_template.render(news=news, data=data, now_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
print("Rendered successfully.")
return render_html
with open("news.html", "w") as f:
html = render_template(get_news(), get_data())
f.write(html)
3.4 news_template.html 模板
打开news_template.html,键入HTML代码:
News - Covid-19
新冠疫情资讯
共计https://blog.csdn.net/wangzirui32/article/details/{{ news | length }}条新闻
更新时间:https://blog.csdn.net/wangzirui32/article/details/{{ now_time }}
{% for i in news %}
-
https://blog.csdn.net/wangzirui32/article/details/{{i['title']}}
媒体:https://blog.csdn.net/wangzirui32/article/details/{{i['author']}}
发布于https://blog.csdn.net/wangzirui32/article/details/{{i['create_time']}}
{% endfor %}
以上资讯来自新浪官网
疫情数据来自网易官网
运行代码,即可在news.html中查看效果了。
好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!



