首页 > 其他分享 >网易新闻爬虫实战

网易新闻爬虫实战

时间:2024-08-22 16:24:14浏览次数:13  
标签:实战 网易 url list 爬虫 urls rm div pl

目录

1. 导入所需库

2. 定义请求头

3. 获取所有板块的链接

4. 获取新闻标题和详情链接

5. 获取新闻详情页内容

6. 多进程加速爬取

7. 保存数据到CSV文件


分享一个关于如何使用Python编写网易新闻爬虫的项目。在这个项目中,我们将使用requests库来获取网页源代码,使用lxml库来解析HTML,使用selenium库来模拟浏览器操作,以及使用multiprocessing库来实现多进程加速爬取速度。最后,我们将把爬取到的数据保存到CSV文件中。

1. 导入所需库

首先,导入所需要的库:

import requests
from lxml import etree
from selenium import webdriver
from time import sleep
import multiprocessing
import csv

2. 定义请求头

接下来,定义一个请求头,用于模拟浏览器访问网站:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
}

3. 获取所有板块的链接

编写一个函数get_news(headers),用于获取首页上所有板块的链接:

def get_news(headers):
    url = "https://news.163.com/"
    plates = []
    plate_urls = []
    response = requests.get(url, headers=headers).text
    tree = etree.HTML(response)
    li_list = tree.xpath('//div[@class="bd"]/div/ul/li')
    for li in li_list:
        plate = li.xpath('.//a/text()')[0]
        plates.append(plate)
        urls = li.xpath('.//a/@href')[0]
        plate_urls.append(urls)
    return plates, plate_urls  # 所有板块的名称,所有板块的链接

4. 获取新闻标题和详情链接

编写一个函数get_news_by_selenium(plate_urls),用于获取新闻标题和详情链接:

def get_news_by_selenium(plate_urls):
    edge = webdriver.Edge(r'/drive/msedgedriver.exe')
    plate_urls_index = [1, 2, 4, 5]
    titles = []
    new_detail_urls = []
    for i in plate_urls_index:
        edge.get(url=plate_urls[i])  # 打开网页
        edge.execute_script("window.scrollTo(0, document.body.scrollHeight)")  # 滚动条滚动到底部
        sleep(2)  # 等待网页加载完成
        plate_urls_source = edge.page_source  # 获取页面响应数据
        tree = etree.HTML(plate_urls_source)
        div_list = tree.xpath('//div[@class="ndi_main"]/div')
        for div in div_list:
            try:
                title = div.xpath('.//div[@class="news_title"]/h3/a/text()')[0]
                titles.append(title)
                new_detail_url = div.xpath('.//div[@class="news_title"]/h3/a/@href')[0]
                new_detail_urls.append(new_detail_url)
            except:
                continue
    edge.quit()  # 关闭浏览器
    return titles, new_detail_urls  # 返回浏览器对象,所有新闻标题,所有新闻详情链接

5. 获取新闻详情页内容

接下来,需要编写一个函数get_news_detail_by_selenium(url),用于获取新闻详情页内容:

def get_news_detail_by_selenium(url):
    index_list_urls = []
    content_list = []
    gentie_list = []
    sanyu_list = []
    rm_pl_list = []
    rm_pl_lists = []
    edge = webdriver.Edge(r'/drive/msedgedriver.exe')
    edge.get(url=url)  # 打开网页
    print('正在爬取' + url + '的内容')
    index_list_urls.append(url)
    edge.execute_script("window.scrollTo(0, document.body.scrollHeight)")  # 滚动条滚动到底部
    sleep(10)  # 等待网页加载完成
    html_content = edge.page_source
    html = etree.HTML(html_content)
    try:
        content = html.xpath('//*[@id="content"]/div[2]/p/text()')
    except:
        content = None
    # 如果找不到gentie则返回None
    try:
        gentie = html.xpath('//*/div[@id="tie"]/div/div[1]/div/a[1]/text()')[0]
    except:
        gentie = None
    try:
        sanyu = html.xpath('//*/div[@id="tie"]/div/div[1]/div/a[2]/text()')[0]
    except:
        sanyu = None
    try:
        rm_pl_div = html.xpath('//*/div[@class="tie-hot"]/div[@class="tie-list"]/div')
        try:
            for div in rm_pl_div:
                rm_pl = div.xpath('.//div[@class="bdy-inner"]/p/a/text()')
                # 获取热评三条评论拼接成一条评论
                rm_pl_str = ''
                for pl in rm_pl:
                    rm_pl_str += pl
                rm_pl_list.append(rm_pl_str)
        except Exception as e:
            print(f"Error in inner try block: {e}")
            rm_pl = None
    except Exception as e:
        print(f"Error in outer try block: {e}")
        rm_pl = None
    content_list.append(content)
    gentie_list.append(gentie)
    sanyu_list.append(sanyu)
    rm_pl_lists.append(rm_pl_list)
    edge.quit()
    return content_list, gentie_list, sanyu_list, rm_pl_lists

6. 多进程加速爬取

为了提高爬取速度,可以使用multiprocessing库来实现多进程爬取:

def worker(url):
    num_processes = 10
    chunk_size = len(url) // num_processes
    results = []
    for i in range(0, len(url), chunk_size):
        urls_chunk = url[i:i + chunk_size]
        with multiprocessing.Pool(processes=num_processes) as pool:
            results.extend(pool.map(get_news_detail_by_selenium, urls_chunk))
    content_list = [item for sublist in results for item in sublist[0]]
    gentie_list = [item for sublist in results for item in sublist[1]]
    sanyu_list = [item for sublist in results for item in sublist[2]]
    rm_pl_lists = [item for sublist in results for item in sublist[3]]
    return content_list, gentie_list, sanyu_list, rm_pl_lists

7. 保存数据到CSV文件

最后,将爬取到的数据保存到CSV文件中:

if __name__ == '__main__':
    plates, plate_urls = get_news(headers)
    titles, new_detail_urls = get_news_by_selenium(plate_urls)
    content_list, gentie_list, sanyu_list, rm_pl_lists = worker(new_detail_urls)

    # 保存到csv文件中
    with open('../../网易新闻.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['标题', '链接', '内容', '跟帖数', '参与人数', '热门评论'])
        # 将 titles ,new_detail_urls, ''.join(content_list), gentie_list, sanyu_list保存到csv文件中
        for i in range(len(new_detail_urls)):
            writer.writerow([titles[i], new_detail_urls[i], ''.join(content_list[i]), gentie_list[i], sanyu_list[i],
                             rm_pl_lists[i]])
    print('爬取完成')

标签:实战,网易,url,list,爬虫,urls,rm,div,pl
From: https://blog.csdn.net/2401_82381243/article/details/141431398

相关文章

  • MySQL 亿级数据平滑迁移实战
    作者:来自vivo互联网服务器团队-LiGang本文介绍了一次MySQL数据迁移的流程,通过方案选型、业务改造、双写迁移最终实现了亿级数据的迁移。一、背景预约业务是vivo游戏中心的重要业务之一。由于历史原因,预约业务数据表与其他业务数据表存储在同一个数据库中。当其他业务......
  • 爬虫: AmazonSpider-亚马逊用户画像
    爬虫:AmazonSpider-亚马逊用户画像使用selenium等工具类,在亚马逊平台上爬去商品信息和用户信息,并进行数据分析和分词统计,最后生成用户画像报告。亚马逊平台访问需要代理访问!github仓库:https://github.com/kimbleex/AmazonSpider.gitstar和fork是一个好习惯!......
  • AI大模型应用开发实战-Agent应用对话情感优化
    1使用prompt设计agent性格与行为添加系统prompt:代码语言:python代码运行次数:0复制CloudStudio代码运行self.SYSTEMPL="""你是一个非常厉害的算命先生,你叫JavaEdge人称Edge大师。以下是你的个人设定:1.你精通阴阳五行,能够算命、紫薇斗数、姓名测算......
  • requests爬虫学习
    #爬虫的过程,就是模仿浏览器的行为,往目标站点发送请求,接收服务器的响应数据,提取需要的信息,并进行保存的过程。#上网的全过程:#  普通用户:#    打开浏览器-->往目标站点发送请求-->接收响应数据-->渲染到页面上。#  爬虫程序:#    模......
  • 【面试宝典】AI大模型大厂实战案例集锦与面试真题详解
    前言最近AI大模型的项目落地,越来越多了,因此越来越多的企业开始招聘AI大模型岗位,本文梳理了AI大模型开发技术的真题面试之道,从AI大模型基础面、AI大模型进阶面、RAG面、Agent面、Fine-tuning微调面、LangChain开发框架面、向量数据库面等不同知识维度,试图找到......
  • SpringBoot中生成二维码的案例实战
    ❃博主首页:「码到三十五」,同名公众号:「码到三十五」,wx号:「liwu0213」☠博主专栏:<mysql高手><elasticsearch高手><源码解读><java核心><面试攻关>♝博主的话:搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,......
  • Synchronized重量级锁原理和实战(五)
    在JVM中,每个对象都关联这一个监视器,这里的对象包含可Object实例和Class实例.监视器是一个同步工具,相当于一个凭证,拿到这个凭证就可以进入临界区执行操作,没有拿到凭证就只能阻塞等待.重量级锁通过监视器的方式保证了任何时间内只允许一个线程通过监视器保护的临界区代码.......
  • TypeScript深度揭秘:Map的全方位详解、作用、特点、优势及实战应用和高级应用
            在TypeScript的广阔世界里,Map对象无疑是一个强大的存在,它提供了灵活且高效的键值对存储机制。今天,我们就来一场轻松而严谨的探秘之旅,全方位解析TypeScript中Map的定义、作用、特点、优势,并通过实战代码示例,带你领略Map的无穷魅力。引言Map是TypeScript(以及Ja......
  • Spring Boot实战:使用模板方法模式优化数据处理流程
    概述在软件开发过程中,我们经常需要处理各种各样的数据,这些数据可能来自不同的源,比如数据库、文件系统或者外部API等。尽管数据来源不同,但很多情况下处理这些数据的步骤是相似的:读取数据、清洗数据、转换数据格式、存储结果等。为了提高代码的复用性和可维护性,我们可以利用设计......
  • 《Python数据分析实战》
    环境搭建定义变量名时要遵循的规则:变量名必须以字母或下画线开始,名字中间只能由字母、数字和下画线组成长度不能超过255个字符变量名在有效范围内必须具有唯一性不能使用保留字(关键字)区分大小写不能对元组中的元素做修改,只能做切片查询。如果元组中只有1个元素,则需要在这......