Python爬虫 | 爬取环境新闻实战

项目:爬取湖北武汉市环境管理局环境新闻

一、观察网页类型

网页地址:?环境新闻-武汉市生态环境局 (wuhan.gov.cn)

目的:判断网页为静态网页还是动态网页,找到数据存放的真实位置。

步骤:

1、打开武汉市生态环境局-环境新闻网址,鼠标右键选中“检查”

2、在右侧出现的界面中选中“网络”,并按下键盘“ctrl+r”键,点击“hjxw/”,最后在“预览”栏中能够看到新闻标题,即证明为静态网页。

总结:静态网页的判断标准是点击"预览"(可能显示英文“preview”),能够看到我们需要的网页数据,就是静态网页。

二、导入相关库

#导入 Python 中的 requests 模块
import requests
#导入 Python 中的 Pandas 库,并使用 pd 作为别名,下次只需要打缩写pd,更加简洁,用来储存数据
import pandas as pd
#Beautiful Soup用于解析HTML或 XML文档,轻松地提取所需的信息,例如网页中的特定标签或数据。
from bs4 import BeautifulSoup
#创建了一个名为 items 的变量,并将其初始化为一个空列表
items=[]

requests是一个常用的HTTP库,用于发送HTTP请求和处理响应,例如获取网页内容

Pandas 是一个强大的数据分析库,它提供了用于数据操作和分析的数据结构.

BeautifulSoup是一个用于从HTML或XML文档中提取需要数据的库,例如解析网页中的特定标签或数据。

三、请求数据

步骤:

1、选中“网络”,ctrl+r之后,选中名称“框中的第一个“hjxw/”,就可以在“标头”里看到“请求URL”以及请求方法。

2、在Spyder里输入请求方式和编码格式,运行结果为200,证明请求成功

url='http://hbj.wuhan.gov.cn/hjxw/index.shtml'
headers = {
    
    'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.41'}
response= requests.get(url=url,headers=headers)
print(response.status_code)
response.encoding=response.apparent_encoding

四、解析数据

将鼠标光标置于网址上,右键选中“检查”,我们可以发现以下几点:

(1)所有新闻都储存在ul标签下的li标签里,所以我们可以选用BeautifulSoup库解析数据,且li标签中中,不同新闻的子链接位于a标签中的href。

通常子链接存在规律性,可以在此找到规律性,例如第一条网址的网址href属性为“./202311/t20231110_2299204.html”,点击进去,发现网址全称为:http://hbj.wuhan.gov.cn/hjxw/202311/t20231110_2299204.html。

标签的href属性 = './202311/t20231110_2299204.html'
完整的href链接 = 'http://hbj.wuhan.gov.cn/hjxw/202311/t20231110_2299204.html'

我们通过BeautifulSoup拿到的标签的href属性,如何从标签的href属性拿到完整的href链接呢?观察法!!

尝试1

标签的href属性 = './202311/t20231110_2299204.html'
完整的href链接 = 'http://hbj.wuhan.gov.cn/hjxw'+ 标签的href属性 

通过尝试1获取的链接为:https://hbj.wuhan.gov.cn/hjxw./202311/t20231110_2299204.html,点击进去无法访问

发现网页链接多了一个.,因此我们需要通过切片的方法,获取正确的网页链接。

尝试2:

标签的href属性 = './202311/t20231110_2299204.html'
完整的href链接 = 'http://hbj.wuhan.gov.cn/hjxw'+ 标签的href属性[1:] 

点击上述网页,发现正常访问。

该部分代码为:

soup=BeautifulSoup(response.text,'html.parser')

Group_list=soup.find('div', class_="lsj-list").find_all('li')
for g in Group_list:
    title=g.find('a',target='_blank').text
    child_url=g.find('a',target='_blank').get('href')  
    #新闻的通用网址,注意武汉生态环境局需要使用切片
    href= 'http://hbj.wuhan.gov.cn/hjxw'+child_url[1:]
    data=g.find('i').text
    #向列表中添加标题、网址、日期时间
    item=[title,href,data]
    #将表中添加含有这些标题、网址、日期时间的内容
    items.append(item)
    #对行命名为项目名称,对列分别命名为标签,网页链接,发布时间。

五、储存数据

利用pandas库将所爬取的数据信息储存下来,excel表中行为每一个新闻名称,列分别命名为’标题’,‘网页链接’,‘发布时间’。

df=pd.DataFrame(items,columns=['标题','网页链接','发布时间'])
df.to_excel(r'C:\Users\13780\Desktop\python实验课运行结果.xlsx') 

六、爬取所有页面数据

由于爬取页面数据默认爬取一页,当我们想快速爬取所有页面数据的时候,我们就需要设置循环爬取每一页的过程,for循环可以做到这点。

设置for循环注意两点:

(1)python默认范围左闭右开,当环境据新闻页数为34时,设置i范围为range(1,35)。

(2)第一页的url为“http://hbj.wuhan.gov.cn/hjxw/index.shtml”,,第二页的url“http://hbj.wuhan.gov.cn/hjxw/index_1.shtml”为那么之后第N页的url为在后面加上_ {i},即为“http://hbj.wuhan.gov.cn/hjxw/index_{i}.shtml”

#加入循环,解读为如果是i=1,url='http://hbj.wuhan.gov.cn/hjxw/index.shtml',如果i=2,则url='http://hbj.wuhan.gov.cn/hjxw/index_{2}.shtml',以此类推

for i in range(1,35):
    if i==1:
        url='http://hbj.wuhan.gov.cn/hjxw/index.shtml'
    else:
        url=f'http://hbj.wuhan.gov.cn/hjxw/index_{i}.shtml'

七、全套代码及运行结果

全套代码如下:

#导入 Python 中的 requests 模块
import requests
#导入 Python 中的 Pandas 库,并使用 pd 作为别名,下次只需要打缩写pd
import pandas as pd
#Beautiful Soup用于解析HTML或 XML文档,轻松地提取所需的信息,例如网页中的特定标签或数据。
from bs4 import BeautifulSoup
#创建了一个名为 items 的变量,并将其初始化为一个空列表
items=[]

#这一步在找新闻页面,我们需要找到所有新闻的页面
#for指的是循环,i不是一个固定的值,为1页到第14页
for i in range(1,35):
#这个==是判断语句,判断i是不是等于1,if是1,执行第一个,如果不是,执行第二个,也就是else  
    if i==1:
        url='http://hbj.wuhan.gov.cn/hjxw/index.shtml'
    else:
        url=f'http://hbj.wuhan.gov.cn/hjxw/index_{i}.shtml'
        
#这一步在找每一个页面下的每一条新闻,就要输入新闻的一些信息,例如新闻通用网址
    headers = {
    
    'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.41'}
    response= requests.get(url=url,headers=headers)
    print(response.status_code)
    response.encoding=response.apparent_encoding
    soup=BeautifulSoup(response.text,'html.parser')

    Group_list=soup.find('div', class_="lsj-list").find_all('li')
    for g in Group_list:
        title=g.find('a',target='_blank').text
        child_url=g.find('a',target='_blank').get('href')     
        #新闻的通用网址,注意武汉生态环境局需要使用切片
        href= 'http://hbj.wuhan.gov.cn/hjxw'+child_url[1:]
        data=g.find('i').text
        #向列表中添加标题、网址、日期时间
        item=[title,href,data]
        #将表中添加含有这些标题、网址、日期时间的内容
        items.append(item)
            
#对行命名为项目名称,对列分别命名为标签,网页链接,发布时间。
df=pd.DataFrame(items,columns=['标题','网页链接','发布时间'])
#保存数据,并命名为python实验课运行结果,可自己为excel取名
df.to_excel(r'C:\Users\13780\Desktop\python实验课运行结果.xlsx') 

运行结果如下:

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除

猜你喜欢

转载自blog.csdn.net/cxyxx12/article/details/135219793