Python爬取中国网新闻

一、制作新闻的Excel索引

  • 观察网页

  • 导入相关库

  • 请求数据

  • 解析数据

  • 保存excel文件

二、将新闻正文内容保存为word

  • 观察网页

  • 导入相关库

  • 对子网页的内容进行爬取并保存成word:以一个子网页为例

  • 1、请求数据

  • 2、解析数据并存储word

  • 循环爬取多个子网页的内容并保存成word

三、全套代码及运行结果

一、制作新闻的Excel索引

观察网页

首先进入网页:http://news.china.com.cn/node_7247300.htm,再通过翻页,对比第1页,第2页以及最后1页的网址,发现它们之间存在着差别,则此网页为静态网页。

根据对比,除了第一页网址不同外,其他页面下的网址为http://news.china.com.cn/node_7247300_{i}.htm,i为其页码,在之后的爬取中,可用for循环和if-else来对不同的页面数据进行爬取。

导入相关库

引入所需的第三方库,代码如下:

import requests
import pandas as pd
from bs4 import Beautifulsoup

请求数据

对于静态网页,我们可用Requests库请求数据。先点击“网页”后刷新网页找到所需的第一个链接“node_7247300.htm”,再点击“标头”可知,网页的请求方式为“GET”。

运行代码,显示Requests[200],即请求成功,则无需伪装请求头。但为防止乱码,我们使用r.encoding=r.apparent_encoding。过程如下:

import requests
from bs4 import BeautifulSoup
import pandas as pd
items = []
url='http://news.china.com.cn/node_7247300.htm'
r=requests.get(url)
r.encoding=r.apparent_encoding
print(r)

解析数据

检查页面,发现所有新闻都储存在‘div’标签下的class_="layout_news"中,每行新闻在上述标签的‘div’,class_="plist1_p"标签下,且在此标签‘h2’下不同新闻的子链接位于’a’标签的’href’中,新闻标题位于’h2’标签中,对应新闻发布时间位于’div’,class_="time"标签中。因此,可以采用BeautifulSoup库解析数据。

由前面的分析,知除首页外,通用网址为http://news.china.com.cn/node_7247300_{i}.htm。因为本文在此处爬取了首页,所以需加上if-else语句。同时,在查找div元素之前,先使用一个for循环。最后,添加了一个append语句,不断将item添加至items。具体代码如下:

items=[] #定义一个空列表,存储信息
for i in range (1,4):
    if i==1:
        url='http://news.china.com.cn/node_7247300.htm'
    else:
        url=f'http://news.china.com.cn/node_7247300_{i}.htm'
   
    r=requests.get(url)
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup (r.text,'html.parser')
    div=soup.find('div',class_="layout_news").find('div',class_="plist1").find('div',class_="plist1_p")
    div_list=soup.find('div',class_="layout_news").find_all('div',class_="plist1")
    for div in div_list:
        title=div.find('h2').text
        date=div.find('div',class_="time").text
        href=div.find('h2').find('a').get('href')
        item=[title,href,date]
        items.append(item)

保存excel文件

使用pd.DataFrame方法将嵌套列表items转变为数据框。

df=pd.DataFrame(items,columns=['标题','网页链接','发布时间'])
df

采用pandas库保存成excel文件具体代码如下:

df.to_excel(r'D:\中国网新闻索引.xlsx')   

二、将新闻正文内容保存为word

观察网页

由于该网站有两种链接形式,无法用一套代码循环爬取所有的子链接新闻。故此处取其中一网页地址占多数的,以".shtml"结尾的网站运用if-else语句进行判断:若网页以".shtml"结尾,则爬取网页正文内容;否则跳过。

if  href.endswith(".shtml"):
    爬取正文内容
else:
    pass

通过在网页空白处右击鼠标,选择检查,按下ctrl+f,来对网页下的一些内容进行查找,若能在检查框中找到相同的文字内容,则说明该网站为静态网站,反之则为动态网站。我们在搜索框中输入“本届”,发现可以找到相同内容,则该网站为静态网站。

导入相关库

import requests
import docx
from docx import Document

对子网页的内容进行爬取并保存成word:以一个子网页为例

请求数据

任意选取一个以".shtml"结尾的网站,先点击“网络”后刷新网页找到所需的第一个链接,再点击“标头”可知,网页的请求方式为“GET”。

运行代码,显示Requests[200],即请求成功,则无需伪装请求头。为防止乱码,我们使用r.encoding=r.apparent_encoding。过程如下:

import requests
href='http://news.china.com.cn/2023-12/10/content_116869341.shtml' # 子链接网址
r=requests.get(url=url)
r.encoding=r.apparent_encoding

解析数据并存储word

对页面的文本位置进行观察,发现新闻标题位于’div’,class_="content"的"h1"中。正文位于’div’,class_="article"下的’p’标签中。因此可用BeautifulSoup库解析数据,并利用for循环将段落爬取到Word。

doc = Document()
soup=BeautifulSoup(r.text,'html.parser')
if  href.endswith(".shtml"):
    title=soup.find('div',class_="content").find('h1').text
    p_list=soup.find('div',class_="article").find_all('p')
    doc.add_heading(title)
  # 将文本内容爬到Word中
    for p in p_list:
        para=p.text
        doc.add_paragraph(para)
else:
    pass
doc.save(r'D:\中国网一个新闻要闻.docx') # 储存数据

循环爬取多个子网页的内容并保存成word

具体代码如下:

from docx import Document
doc = Document()
for i in range(len(df)):
    title=df.iloc[i]['标题']
    date=df.iloc[i]['发布时间']
    href=df.iloc[i]['网页链接']
    print(href)
    r=requests.get(url=href,verify=False)
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,'html.parser')
    if  href.endswith(".shtml"):
        title=soup.find('div',class_="content").find('h1').text
        p_list=soup.find('div',class_="article").find_all('p')
        doc.add_heading(title)
      # 将文本内容爬到Word中
        for p in p_list:
            para=p.text
            doc.add_paragraph(para)
    else:
        pass 
doc.save(r'D:\中国网要闻.docx') # 储存数据

三、全套代码及运行结果

全套代码如下:

import pandas as pd
import requests
from bs4 import BeautifulSoup
items=[] #定义一个空列表,存储信息
for i in range (1,4):
    if i==1:
        url='http://news.china.com.cn/node_7247300.htm'
    else:
        url=f'http://news.china.com.cn/node_7247300_{i}.htm'
    r=requests.get(url) #请求网页信息
    r.encoding=r.apparent_encoding #防止乱码
    soup=BeautifulSoup (r.text,'html.parser') # 解析数据
    div=soup.find('div',class_="layout_news").find('div',class_="plist1").find('div',class_="plist1_p")
    div_list=soup.find('div',class_="layout_news").find_all('div',class_="plist1")
    # 爬取每一个网页中新闻的子链接信息
    for div in div_list:
        title=div.find('h2').text
        date=div.find('div',class_="time").text
        href=div.find('h2').find('a').get('href')
        item=[title,href,date]
        items.append(item)
df=pd.DataFrame(items,columns=['标题','网页链接','发布时间'])
df.to_excel(r'D:\中国网新闻索引.xlsx')  # 储存excel索引
from docx import Document
doc = Document()
for i in range(len(df)):
    title=df.iloc[i]['标题']
    date=df.iloc[i]['发布时间']
    href=df.iloc[i]['网页链接']
    print(href)
    r=requests.get(url=href,verify=False)
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,'html.parser')
    if  href.endswith(".shtml"):
        title=soup.find('div',class_="content").find('h1').text
        p_list=soup.find('div',class_="article").find_all('p')
        doc.add_heading(title)
        # 将文本内容爬到Word中
        for p in p_list:
            para=p.text
            doc.add_paragraph(para)
    else:
        pass
doc.save(r'D:\中国网要闻.docx') # 储存word

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

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

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

img
img

二、Python必备开发工具

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

三、最新Python学习笔记

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

img

四、Python视频合集

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

img

五、实战案例

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

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
<think>好的,我现在需要帮助用户解决如何用Python编写爬虫抓取中国新闻关于滑坡的新闻数据的问题。首先,我应该回忆一下之前用户提供的参考引用,看看有没有相关的示例或功能可以借鉴。 用户提到的引用[1]是关于使用urllib.request和BeautifulSoup抓取新浪新闻的例子,这可能对解析页结构有帮助。引用[2]涉及数据存储、清洗和可视化,虽然用户当前的问题主要是爬取,但后续可能需要这些步骤,所以可以适当提及。 接下来,我需要确定中国新闻的结构。首先,用户需要明确目标站是哪个,假设是www.chinanews.com。然后,我需要分析该站的页面结构,特别是搜索滑坡相关新闻的URL参数。通常,新闻站会有搜索功能,通过构造包含关键词的URL来获取相关新闻列表。 比如,中国新闻的搜索URL可能类似于http://sou.chinanews.com/search.do?q=滑坡,这里q参数是搜索关键词。不过需要实际查看站确认。此外,可能还需要处理分页,比如通过添加page参数来遍历多页结果。 然后,需要解析搜索页面,提取新闻链接。使用BeautifulSoup来定位包含新闻链接的HTML元素,比如可能是某个class的div下的a标签。例如,在引用[1]的例子中,使用了find_all来查找特定标签和类,这里可以类似处理。 接下来,针对每个新闻链接,发送请求获取详细内容,并提取标题、时间、正文等信息。需要注意的是,中国新闻可能有反爬机制,比如User-Agent检查,所以需要设置请求头模拟浏览器访问。此外,频率控制也很重要,避免被封IP,可以加入time.sleep。 数据存储部分,用户可能需要将数据保存到CSV文件或数据库。引用[2]中提到使用数据库存储,并利用Pandas清洗数据,这里可以建议用户使用CSV作为简单存储,或者SQLite等轻量级数据库。 代码结构方面,可以分步骤:1. 发送搜索请求,获取新闻列表页;2. 解析列表页,提取新闻链接;3. 遍历链接,抓取详细内容;4. 存储数据。同时,异常处理也很重要,比如网络请求失败时的重试机制,或者解析失败时的日志记录。 潜在的问题可能包括站结构变化,导致选择器失效,或者反爬措施升级。需要提醒用户定期检查爬虫的有效性,并遵守站的robots.txt规定。 最后,生成相关问题,帮助用户深入思考,比如如何处理动态加载的内容,或者如何进行数据清洗和可视化,这些在引用[2]中都有涉及,可以作为扩展建议。</think>### Python爬取中国新闻滑坡新闻数据步骤 #### 1. 分析目标站结构 中国新闻搜索页URL示例: ``` http://sou.chinanews.com/search.do?q=滑坡&start=0&sort=time ``` 参数说明: - `q=滑坡`:搜索关键词 - `start=0`:分页起始位置(每页显示10条) - `sort=time`:按时间排序 #### 2. 编写基础爬虫代码 ```python import requests from bs4 import BeautifulSoup import csv import time headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } def get_news_list(keyword, page): url = f'http://sou.chinanews.com/search.do?q={keyword}&start={(page-1)*10}' try: response = requests.get(url, headers=headers, timeout=10) soup = BeautifulSoup(response.text, 'html.parser') links = [a['href'] for a in soup.select('.news_title a')] return links except Exception as e: print(f'获取列表页失败:{e}') return [] def get_news_detail(url): try: response = requests.get(url, headers=headers, timeout=10) soup = BeautifulSoup(response.text, 'html.parser') title = soup.find('h1', class_='title').text.strip() pub_time = soup.find('div', class_='left-t').text.split('来源')[0].strip() content = '\n'.join([p.text for p in soup.select('.left_zw p')]) return { '标题': title, '发布时间': pub_time, '正文': content, '链接': url } except Exception as e: print(f'解析详情页失败:{e}') return None # 存储到CSV文件 with open('landslide_news.csv', 'w', newline='', encoding='utf-8-sig') as f: writer = csv.DictWriter(f, fieldnames=['标题','发布时间','正文','链接']) writer.writeheader() for page in range(1, 6): # 抓取前5页 print(f'正在抓取第{page}页...') news_links = get_news_list('滑坡', page) for link in news_links: data = get_news_detail(link) if data: writer.writerow(data) time.sleep(2) # 控制请求频率 ``` #### 3. 关键功能说明 - 反爬处理:设置`User-Agent`头模拟浏览器访问 - 数据解析:使用`BeautifulSoup`定位特定DOM元素 - 分页控制:通过修改`start`参数实现分页 - 频率控制:`time.sleep(2)`降低请求频率 #### 4. 数据存储扩展建议 可将数据存入MySQL数据库(如引用[2]方案): ```python import pymysql conn = pymysql.connect(host='localhost', user='root', password='123456', database='news_db') cursor = conn.cursor() create_table_sql = ''' CREATE TABLE IF NOT EXISTS landslide_news ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255), pub_time DATETIME, content TEXT, url VARCHAR(255) )''' cursor.execute(create_table_sql) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值