家长叫我别天天我在房间没事多看看新闻,我说我马上写个爬虫爬新闻看!!!


前言

本文爬虫源码已由 GitHub https://github.com/2335119327/PythonSpider 已经收录(内涵更多本博文没有的爬虫,有兴趣的小伙伴可以看看),之后会持续更新,欢迎Star

真的好久好久没写爬虫了,都快忘干净了,简历上写了熟悉爬虫,我总不能跟面试官说我忘记了吧🤣

正好今天抽点空,写个爬虫来回忆回忆。

标题是真的,只不过是没上大学之前家长说的,我记得他们说的以后出去了要学会跟人交流,不能在那大眼瞪小眼,多看看新闻,跟人家还有点话题说说…

其实长时间没写爬虫不是因为不想写,是不知道写什么了,小伙伴们有什么建议写的可以在评论区留下言,我有空有能力就写写,当然,必须是正经的网站(手动狗头)

话不多说,开造!!!



撸起袖子开始看新闻(爬新闻)


先看网页

在这里插入图片描述

一个个模块对应着一个 li,所以我们拿到 li 的父标签 ul 遍历即可获得所有 li(模块)

插上一句,本片文章适合有基础的小伙伴们看,如果是刚入门的小伙伴可来我的爬虫专栏学习,一步步成为大佬!!!

爬虫专栏

import requests
from bs4 import BeautifulSoup
import os

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



url = "https://news.163.com/"
response = requests.get(url=url,headers=headers)

data = BeautifulSoup(response.text,"html.parser")

li_list = data.find(class_="ns_area list").find_all("li")

print(li_list)

这样就拿到了标题和标题详情页的URL
在这里插入图片描述

拿到这些模块的URL,那么我们就要去获取这些模块详情页一片片文章的URL了

一篇文章对应一个div,所以我们去获取这些文章的父标签
在这里插入图片描述

根据class定位到父标签之后,在获取改标签下的所有div标签即可获得所有文章的div标签

而所有文章div标签下有共同点,那就是在文章div标签下有 <div class= new_title>标签,在这个标签下有a标签存放着文章详情页的URL

在这里插入图片描述

    #获取文章标签下所有class为news_title的标签
    div_list = model_data.find(class_="ndi_main").find_all(class_="news_title")
    for i in div_list:
    	#获取news_title标签下的a标签的href属性,即文章详情页URL
        detail_url = i.find("a")["href"]
        parse_detail(detail_url, model_path)

获得到文章详情页URL后,那么就要去文章详情页获取数据了

可见文章内容都在一个class值为post_body的div标签下,而文章的内容也都是在一个个p标签下

在这里插入图片描述

#文章标题
title = detail_data.find(class_="post_title").text
#因为要保存为txt文件所以要把标题有些字符替换掉
title = replaceTitle(title)
#获取所有p标签
body = detail_data.find(class_="post_body").find_all("p")


完整代码

from selenium import webdriver
import time
import os
import requests
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ChromeOptions
from bs4 import BeautifulSoup

path = "./网易新闻"


# 初始化
def init():
    # 实现无可视化界面得操作
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')

    # 设置chrome_options=chrome_options即可实现无界面
    driver = webdriver.Chrome(chrome_options=chrome_options)
    # driver = webdriver.Chrome()
    # 把浏览器实现全屏
    # driver.maximize_window()
    # 返回driver
    return driver


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


# 获取模块URL
def getUrl(driver):
    url = "https://news.163.com/"
    driver.get(url)
    response = driver.page_source
    # 目标标题索引
    target_list = [2, 3, 5]
    data = BeautifulSoup(response, "html.parser")
    li_list = data.find(class_="ns_area list").find_all("li")
    for index in target_list:
        url = li_list[index].find("a")["href"]
        title = li_list[index].find("a").text
        # 如果模块文件埃及不存在就要创建
        if not os.path.exists(path):
            os.mkdir(path)
        model_path = path + "/" + str(title)
        # 如果模块文件不存在就要创建
        if not os.path.exists(model_path):
            os.mkdir(model_path)
        parse_model(driver, url, model_path)


# 获取模块页面URL
def parse_model(driver, url, model_path):
    driver.get(url)
    model_response = driver.page_source
    model_data = BeautifulSoup(model_response, "html.parser")
    div_list = model_data.find(class_="ndi_main").find_all("div")
    for i in div_list:
        if i.find("a") is not None and i.find("a").find("img") is not None:
            detail_url = i.find("a")["href"]
            parse_detail(detail_url, model_path)


# 爬取详情页
def parse_detail(detail_url, model_path):
    detail_response = requests.get(url=detail_url, headers=headers).text
    detail_data = BeautifulSoup(detail_response, "html.parser")
    if detail_data.find(class_="post_title") is None:
        return
    #文章标题
    title = detail_data.find(class_="post_title").text
    title = replaceTitle(title)
    body = detail_data.find(class_="post_body").find_all("p")
    print("正在保存:" + title)
    try:
        with open(model_path + "/" + title + ".txt", "w", encoding="utf-8") as f:
            for i in body:
                f.write(str(i.text.strip()) + "\n")
        f.close()
    except:
        os.remove(model_path + "/" + title + ".txt")


symbol_list = ["\\", "/", "<", ":", "*", "?", "<", ">", "|","\""]

def replaceTitle(title):
    for i in symbol_list:
        if title.find(str(i)) != -1:
            print(title)
            title = title.replace(str(i),"")

    return title


if __name__ == '__main__':
    driver = init()
    getUrl(driver)



爬取结果(看新闻喽)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述



最后

我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!

创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以一键三连哦!,感谢支持,我们下次再见~~~

分享大纲

大厂面试题专栏


Java从入门到入坟学习路线目录索引


开源爬虫实例教程目录索引

更多精彩内容分享,请点击 Hello World (●’◡’●)

本文爬虫源码已由 GitHub https://github.com/2335119327/PythonSpider 已经收录(内涵更多本博文没有的爬虫,有兴趣的小伙伴可以看看),之后会持续更新,欢迎Star

  • 103
    点赞
  • 178
    收藏
    觉得还不错? 一键收藏
  • 68
    评论
评论 68
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值