爬虫学习 例子

news2024/9/20 17:57:30

以新能源网为例

【10-实战课】从源码获取豆瓣电影TOP250_哔哩哔哩_bilibili

1.查看网站结构

 

 可见结构比较简单,直接循环爬取即可

2.代码(无数据存储)

import requests
from bs4 import BeautifulSoup
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36"}

for start_num in range(194120,194124,1): #194120整篇文章在网站上没有
    response = requests.get(f"http://www.china-nengyuan.com/news/{start_num}.html", headers=headers)
    soup = BeautifulSoup(response.text,"html.parser")
    all_titles = soup.findAll("td", attrs={"height": "60","align": "center","style": "line-height:25px;"})
    all_links = soup.findAll("td", attrs={"valign": "top","class": "f16 news_link", "style": "padding-left:10px;line-height:30px"})
    for title in all_titles:
        print("标题为:    ",title.find("h1", attrs={"class": "f20", "style": "margin:0;"}).string.strip())
        for link in all_links:
            all_texts = link.findAll("p")
            print("文章内容为:  ")
            for text in all_texts:
                if text.findAll("img"): #文章中的图片也是p,也是段落,这里跳过
                    continue
                print(text.string)  #只输出文本
"td",attrs={"height": "60","align": "center","style": "line-height:25px;"} 对应:

 

 找到标题的特定属性,用attrs指定,即可输出标题信息。但现在输出的信息中有html标签。

所以输出时:

print("标题为:    ",title.find("h1", attrs={"class": "f20", "style": "margin:0;"}).string.strip())

使用 find() 方法查找页面中的所有标题元素。在找到标题元素后,代码使用 string 属性获取标题文本,并使用 strip() 方法去除标题文本中的 HTML 标签和空格。最后,代码将标题文本输出到控制台。

接下来的正文都在td范围内

"td", attrs={"valign": "top","class": "f16 news_link", "style": "padding-left:10px;line-height:30px"}

然后内容都在p范围内,直接输出文本即可 

这里有个问题,在爬取文章段落时,文章中的图片也算一个段落,爬取后会在一行显示一个NONE,因为这一行没有文本信息。

 

所以这里用

for text in all_texts:
    if text.findAll("img"): #文章中的图片也是p,也是段落,这里跳过
        continue

跳过

最后输出

 2.爬取到桌面文件中

import requests
from bs4 import BeautifulSoup
import os
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36"}

for start_num in range(194120,194124,1): #194120整篇文章在网站上没有
    response = requests.get(f"http://www.china-nengyuan.com/news/{start_num}.html", headers=headers)
    soup = BeautifulSoup(response.text,"html.parser")
    all_titles = soup.findAll("td", attrs={"height": "60","align": "center","style": "line-height:25px;"})
    all_links = soup.findAll("td", attrs={"valign": "top","class": "f16 news_link", "style": "padding-left:10px;line-height:30px"})
    for title in all_titles:
        print("标题为:    ",title.find("h1", attrs={"class": "f20", "style": "margin:0;"}).string.strip())
        for link in all_links:
            all_texts = link.findAll("p")
            print("文章内容为:  ")
            for text in all_texts:
                if text.findAll("img"): #文章中的图片也是p,也是段落,这里跳过
                    continue
                print(text.string)  #只输出文本
                file_name = f"new_energy_bug.txt" #打开文件夹中的文件并写入
                with open(os.path.join("C:\\Users\\qjjt\\Desktop\\new_energy_bug", file_name), "a",encoding='utf-8') as f: #a表示继续写入,指定编码方式
                    f.write(text.string)

依然存在问题

  1. 因为是从网站上爬取,所以文本位置在文件中间
  2. 这里没将标题写入
  3. 新闻之间未分开一定间隔

3.余下问题

改进后的代码

import requests
from bs4 import BeautifulSoup
import os
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36"}


#必要准备
file_name = f"new_energy_bug.txt" #打开文件夹中的文件并写入

#爬取文章并存入txt
for start_num in range(194120,194124,1): #194120整篇文章在网站上没有
    response = requests.get(f"http://www.china-nengyuan.com/news/{start_num}.html", headers=headers)
    soup = BeautifulSoup(response.text,"html.parser")
    all_titles = soup.findAll("td", attrs={"height": "60","align": "center","style": "line-height:25px;"})
    all_links = soup.findAll("td", attrs={"valign": "top","class": "f16 news_link", "style": "padding-left:10px;line-height:30px"})
    for title in all_titles:
        print("标题为:    ",title.find("h1", attrs={"class": "f20", "style": "margin:0;"}).string.strip())
        #将标题写入TXT文件,然后立刻关闭
        with open(os.path.join("C:\\Users\\qjjt\\Desktop\\new_energy_bug", file_name), "a", encoding='utf-8') as f:
            f.write("\n标题为:  ")
            f.write(title.find("h1", attrs={"class": "f20", "style": "margin:0;"}).string.strip())
            f.close()
        for link in all_links:
            all_texts = link.findAll("p")
            with open(os.path.join("C:\\Users\\qjjt\\Desktop\\new_energy_bug", file_name), "a", encoding='utf-8') as f:
                f.write("\n文章内容为:  ")
                f.write("\n")
                f.close()
            print("文章内容为:  ")
            for text in all_texts:
                if text.findAll("img"): #文章中的图片也是p,也是段落,这里跳过
                    continue
                print(text.string)  #只输出文本
                with open(os.path.join("C:\\Users\\qjjt\\Desktop\\new_energy_bug", file_name), "a",encoding='utf-8') as f: #a表示继续写入,指定编码方式
                    f.write(text.string)

#字符串靠左边

file1 = open("C:\\Users\\qjjt\\Desktop\\new_energy_bug\\new_energy_bug.txt", 'r', encoding='utf-8')   # 打开要去掉空行的文件
file2 = open("C:\\Users\\qjjt\\Desktop\\new_energy_bug\\new_energy_bug_new.txt", 'w+', encoding='utf-8')  # 生成没有空行的文件

for line in file1.readlines():
    line = line.lstrip()  #从字符串的左边消除空格,strip()是两边同时消除
    if "标题" in line:
        file2.write("\n\n")
    file2.write(line)

file1.close()
file2.close()

1.标题写入

        用的笨办法,在得到标题和内容后,打开TXT目标文件,写入字符串,然后自己关闭。因为with open在下面还有代码时会一直执行,所以最好手动关闭

2.消除字符串文本左边的空格

        因为网页中的原始文本是在页面中间的,所以这里用lstrip()函数只去除每行文本左边的空格,strip()会去除两边,使文本都黏在一起。

3.新闻见分开一定距离

因为之前加了标题几个字,所以设置为只要检测到标题两个字在行,就先空两行,再把这行内容写入新文件中

最终效果

爬取新闻的第一个文件

经过整理的第二个文件

 其中有一篇新闻只有标题,是因为网站把那篇文章删除了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

追梦之旅【数据结构篇】——看看小白试如何利用C语言“痛”撕堆排序

追梦之旅【数据结构篇】——看看小白试如何利用C语言“痛”撕堆排序 ~😎 前言🙌堆的应用 —— 堆排序算法:堆排序算法源代码分享运行结果测试截图: 总结撒花💞 😎博客昵称:博客小梦 &#x1f60…

【菜鸡读论文】Cross-domain Named Entity Recognition via Graph Matching

【菜鸡读论文】Cross-domain Named Entity Recognition via Graph Matching 最近到了研一下学期,很多身边的同学也开始有了成果,但本菜鸡一点成果都没有【大哭】所以也没什么好写的。虽然菜鸡口头上不说,但内心也感受到非常之焦虑。最近读论…

Linux 触摸屏 (IIC驱动详解)

前言: 本文使用触摸屏iic驱动,驱动编写中要使用总线,设备,驱动分层的思想,IIC总线,触摸屏驱动,触摸屏设备, IIC总线驱动 一般 SOC 的 I2C 总线驱动都是由半导体厂商编写的&…

使用SeaFile搭建私有云盘并公网访问【cpolar内网穿透】

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 现在我们身边的只能设备越来越多&#xff…

20230420使用逻辑分析仪测量摄像头的PAG7920的时钟信号

20230420使用逻辑分析仪测量摄像头的PAG7920的时钟信号 2023/4/20 19:14 在CV1826平台: 1、vsync信号:刷新率120HZ PAG7920LT: Ultra-Low Power Global Shutter Image Sensor Max. Frame Rate 180 FPS 20KSa/20KHZ 2、href行同步信号:KHZ级别…

栈的定义、存储结构、基本操作、案例

📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录 栈栈的存储栈的基本操作进栈出栈读栈顶元素记录栈内元素个数清除栈内所有元…

详版Git命令播报

文章目录 下载安装Git 配置config文件配置用户信息查看配置信息 工作协作流程git四个区协作流程 初始化新仓库检出仓库git clonegit remote本地存有代码进行clone没有git仓库已存在git仓库 提交与修改git add 及 git statusgit diffgit commitgit resetgit rmgit mv 查看提交历…

DHCP故障定位

1.请分析可能的原因,定位并排除故障。 (1)存在仿冒DHCP服务器攻击 导致部分有线终端获取到错误的IP地址、网关等信息,进而导致无法访问网关。 解决办法:为了防止DHCP Server仿冒者攻击,将与合法DHCP服务器直接或间接连接的接口设置为信任接口,其他接口设置为非信信任接…

Flutter开发日常练习-pageview滑动视图动画

养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子 学着写一下滑动页面 pageview实现左右滑动视图 class SlidingContainer extends StatefulWidget {const SlidingContainer({super.key});overrideState<SlidingContainer> createState() > _Slidi…

【C语言学习3——基本的C语言语法知识2】

C语言学习3——基本的C语言语法知识 标识符关键词什么是字面常量&#xff1f;printf函数printf函数更多用法 #include命令 标识符 在前面的代码中&#xff0c;由我们自己命名&#xff0c;用于指代某一个实体的名称&#xff0c;例如:add&#xff0c;result&#xff0c;函数的参…

【Qt笔记】5.QWidget源码查阅

文章目录 1 概述2 相关成员函数详解2.1 构造函数2.2 设置尺寸2.3 槽函数 1 概述 QWidget类是所有用户界面对象的基类。从QObject和QPaintDevice里继承过来 class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice由上可以看出qt是把其封装成dll供外部接口调用…

vue2引入Element UI的详细步骤

目录 一、Element UI介绍 Element UI的特点&#xff1a; vue3引入Element plus的文章&#xff1a; 二、操作步骤 三、快速上手测试&#xff08;可做可不做&#xff09; 一、Element UI介绍 Element UI是一个基于Vue.js的组件库&#xff0c;提供了一套丰富、美观、易用的…

《类和对象》(下篇)

本文主要讲解类和对象的一些其他小知识。 文章目录 前情回顾一、用运算符重载写一个输入流和输出流①流插入②流提取③流提取和流插入的优化 二、const成员三、用运算符重载改变数组 1、再谈构造函数1.1 构造函数体赋值(不相当于初始化)1.2 初始化列表①引出初始化列表②怎么用…

GBDT+LR论文翻译

0.摘要 在线广告允许广告客户仅针对可衡量的用户响应进行出价和付费&#xff0c;例如广告点击。因此&#xff0c;点击预测系统是大多数在线广告系统的核心。伴随每日活跃用户超过7.5亿&#xff0c;活跃广告客户超过100万的情况&#xff0c;预测Facebook广告点击是一项具有挑战…

【题解】P4055 [JSOI2009] 游戏

link 题目大意 题目说得比较清楚。 题解 前置知识&#xff1a;二分图最大匹配、基础博弈论。 每个点只能走一次的四联通点阵&#xff0c;可以想到二分图匹配。 将其套路地奇偶分点&#xff0c;相邻两点连边&#xff08;显然不能为 #&#xff09;。 先求一个最大匹配。 …

单片机 0~10V 输出电路的实现

聊聊单片机实现 0~10V 输出电路的几种方案 ...... by 矜辰所致目录 前言一、MCU 的 DAC二、PWM 加滤波电路2.1 PWM 输出 DAC2.2 PWM 接滤波器的RC值选择说明2.3 0~ 3.3V PWM 输出 0 ~10V方案一&#xff1a;RC 滤波器方案二&#xff1a;三极管 三、专用转换芯片结语 前言 好…

操作系统(3.1)--处理机调度和作业

目录 一、处理机调度层次 1.高级调度(High Level Scheduling) 2.低级调度&#xff08;Low Level Scheduling) 3.中级调度(Intermediate Scheduling) 二、处理机调度算法的目标 1.处理机调度算法的共同目标 2.批处理系统的目标 3.分时系统的目标 三、批处理系统中的作业…

【k8s完整实战教程3】k8s集群部署kubesphere

系列文章&#xff1a;这个系列已完结&#xff0c;如对您有帮助&#xff0c;求点赞收藏评论。 读者寄语&#xff1a;再小的帆&#xff0c;也能远航&#xff01; 【k8s完整实战教程0】前言【k8s完整实战教程1】源码管理-Coding【k8s完整实战教程2】腾讯云搭建k8s托管集群【k8s完…

【C++】海量数据面试题

海量数据面试题 文章目录 海量数据面试题一、哈希切割二、位图应用1.给定100亿个整数&#xff0c;设计算法找到只出现一次的整数2.求两个文件交集3.在100亿个整数中找到出现次数不超过2次的所有整数 三、布隆过滤器1.求两文件交集&#xff08;近似算法&#xff09;2.求两文件交…

气传导和骨传导耳机哪个好?简单科普这两种蓝牙耳机

在生活中&#xff0c;我们经常会用到耳机&#xff0c;特别是在日常娱乐听歌、运动休闲、户外通勤的时候&#xff0c;一款舒适的耳机是必不可少的。 而最近几年&#xff0c;随着科技的发展&#xff0c;各大品牌也相继推出了各种类型的耳机&#xff0c;其中比较热门的就有气传导…