基于python的新闻爬虫

咱们这个任务啊,就是要从一个指定的网站上,抓取新闻内容,然后把它们整整齐齐地保存到本地。具体来说,就是要去光明网的板块里,瞅瞅里面的新闻,把它们一条条地保存下来。

首先,咱得有个网址,这就是咱要去的地方。然后用requests这个神奇的小工具,向这个网址发送个GET请求,就像是对网站说“喂,把你的内容给我送过来”。

接下来,用lxml这个库来解析网页,就像是拿到一本书,咱得知道目录在哪儿,正文在哪儿,才能把需要的内容找出来。

咱们的目标是抓取页面上的新闻链接,这些链接被放在了一系列的ul和li标签里。所以,咱得一个个ul去看,每个ul里面又是一堆li,每个li里面才是咱们要的新闻链接。

找到链接后,咱再次用requests去访问这个链接,把新闻的详细内容给抓回来。标题、正文咱都要,然后把它们整理一下,每条新闻保存成一个txt文件,文件名就按照咱抓取的顺序来编号,这样方便管理。

过程中,咱得注意,网页上的链接可能有的是完整的,有的可能就给了个后缀,咱得处理好这个,确保能正确访问到新闻的详细页面。然后,就是把新闻的标题和内容提取出来,去掉多余的空白字符,整整齐齐地写入到文件里。

这样一来,只要运行这段代码,咱就能自动化地把网站上的新闻一条条地保存到本地了,省时省力,还能随时回头看看收集到的新闻呢。

后续如果需要额外的处理和补充可以私信联系我

import requests
from lxml import html
import os

# 目标网站的url
base_url = "https://politics.gmw.cn/"
url = base_url + "node_9844.htm"

# 使用requests库发送GET请求到目标网站
response = requests.get(url)
response.encoding = 'utf-8'  # 尝试使用utf-8解码

# 解析HTML内容
tree = html.fromstring(response.text)  # 使用text代替content

# 文件编号
file_num = 1

# 循环处理从ul[1]到ul[10]
for ul_index in range(1, 11):
    # 循环处理每个ul中的li标签,从li[1]开始,如果没有找到li标签,就跳出循环
    li_index = 1
    while True:
        try:
            # 构建XPath
            xpath = f'/html/body/div[6]/div[1]/div[2]/ul[{ul_index}]/li[{li_index}]/a'
            
            # 使用XPath查找特定的a标签
            a_tag = tree.xpath(xpath)
            
            # 如果找到了a标签
            if a_tag:
                # 获取a标签的href属性,也就是URL
                sub_url = a_tag[0].get('href')
                sub_url = base_url + sub_url if not sub_url.startswith('http') else sub_url
                print("子url为:",sub_url)

                # 获取子页面内容
                sub_response = requests.get(sub_url)
                sub_response.encoding = 'utf-8'  # 尝试使用utf-8解码
                sub_tree = html.fromstring(sub_response.text)  # 使用text代替content

                # 获取标题
                title = sub_tree.xpath('/html/body/div[6]/div[1]/h1/text()')
                title = title[0].strip() if title else ''  # 去除两端的空白字符

                # 获取正文
                contents = sub_tree.xpath('//*[@id="article_inbox"]/div[5]/p/text()')
                contents = '\n'.join([content.strip() for content in contents if content.strip()]) if contents else ''  # 去除两端的空白字符,并删除空行

                # 写入到文件
                with open(f'./txt/{str(file_num).zfill(2)}.txt', 'w', encoding='utf-8', errors='ignore') as f:
                    f.write(title + '\n\n' + contents)

                # 更新文件编号
                file_num += 1
            else:
                # 如果没有找到a标签,就跳出循环
                break

            # 处理下一个li标签
            li_index += 1
        except Exception as e:
            print(f"处理XPath {xpath} 时发生错误: {e}")
            break

输出结果如下:

子url为: https://politics.gmw.cn/2023-06/28/content_36660331.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36660279.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36660246.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36660217.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36660215.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36660103.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36659630.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36659390.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36659337.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36659325.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36659297.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36659135.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658702.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658613.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658674.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658631.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658595.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658527.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658463.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658416.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658377.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658411.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658401.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658372.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658356.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657735.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657732.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657622.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657620.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657627.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658305.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657625.htm
子url为: https://politics.gmw.cn/2023-06/28/content_36658293.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657544.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657204.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657203.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36657192.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655447.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655793.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655772.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655744.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655734.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655703.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655712.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655729.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655735.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655693.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655613.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655425.htm
子url为: https://politics.gmw.cn/2023-06/27/content_36655404.htm

你可能感兴趣的:(爬虫)