当前位置: 首页 > article >正文

【python爬虫基础】年轻人的第一个爬虫程序

本文的目标是爬取豆瓣读书的top250书籍名称以及对应网址

在这里插入图片描述
🌈个人主页:Yui_
🌈Linux专栏:Linux
🌈C语言笔记专栏:C语言笔记
🌈数据结构专栏:数据结构
🌈C++专栏:C++

文章目录

  • 1.前言
  • 2.准备阶段
  • 3.向网站发起请求
  • 4.获取HTML文本
  • 5.解析HTML信息
  • 6.清除多余的空白信息
  • 7.最终结果演示
  • 代码

1.前言

网络爬虫(Web Crawler),也称为网络蜘蛛(Web Spider)或网络机器人(Web Bot),是一种自动化程序,用于从网站中提取和收集信息。它通过系统地浏览互联网,访问网页并提取其中的内容,常用于搜索引擎、数据挖掘以及其他需要大量信息的场景。
工作原理

  1. 种子URL:爬虫通常从一个或多个种子URL(即初始网页)开始。
  2. 抓取页面:爬虫访问种子URL并下载网页内容,这个过程类似于用户在浏览器中打开网页。
  3. 解析内容:解析HTML或其他格式的内容,提取有价值的信息(如文本、图片、链接等)。
  4. 获取新链接:从已抓取的网页中提取链接,然后爬虫会继续访问这些新的链接,形成爬取的循环。
  5. 存储数据:爬虫提取的信息会被保存到数据库或文件中,供后续分析或使用。

常见应用

  1. 搜索引擎:Google、Bing等搜索引擎通过网络爬虫抓取网页内容,构建搜索索引,以便用户能够搜索到最新的信息。
  2. 数据收集和分析:许多企业和研究机构使用爬虫获取市场趋势、社交媒体数据、价格信息等。
  3. 内容聚合:新闻聚合网站、比价网站利用爬虫收集来自不同来源的内容。

常用技术与工具

  1. Requests 和 BeautifulSoupRequests用于发送HTTP请求,BeautifulSoup用于解析HTML文档。适合于小型爬虫任务。
  2. Scrapy:一个流行的Python爬虫框架,提供强大的功能,适用于大型、复杂的爬虫项目。
  3. Selenium:适用于需要模拟用户行为、抓取动态内容的场景。它可以与浏览器集成,模拟用户操作。

爬虫的挑战

  1. 反爬虫机制:许多网站设置了限制或防御机制,防止过度爬取。例如,通过CAPTCHA、IP封禁、请求频率限制等方式。
  2. 动态内容:一些网站使用JavaScript动态加载内容,这使得传统的爬虫难以获取全部信息。
  3. 法律和道德:爬虫行为受法律和网站协议(如robots.txt)限制。需要注意尊重网站的使用政策,避免非法获取数据。

2.准备阶段

import requests
import re
from bs4 import BeautifulSoup

requests 是 Python 中一个非常流行且简单易用的库,用于发送 HTTP 请求并处理响应。它是一个用于与网络服务进行交互的高级库,提供了方便的接口来发送各种 HTTP 请求。
安装指令pip install requests
re 是 Python 内置的正则表达式模块,专门用于执行正则表达式操作。正则表达式(Regular Expression, 简称 regex)是一种用于匹配字符串的模式,可以用于查找、替换、拆分等操作。re 模块不需要额外安装,它随 Python 标准库一起提供。
BeautifulSoup 是一个用于从 HTML 或 XML 文件中提取数据的 Python 库。它通过解析 HTML 或 XML 文档,能够方便地提取结构化数据,常用于网络爬虫和网页数据分析。
安装指令pip install beautifulsoup4

3.向网站发起请求

#目标网站:豆瓣读书
url = 'https://book.douban.com/top250?start='

#伪造为浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

先用字符串变量开存储目标网站的网址,然后伪装成浏览器,为了防止网页拒绝访问。
向网页发起请求

#向网页发起请求
response = requests.get(url,headers=headers)

当请求成功时,response.status_code会返回200,如果失败,会返回相应的错误数字如404等等。

4.获取HTML文本

请求成功后,我们需要获取HTML文本。

if response.status_code == 200:
    print('请求成功!')
    print(response.text)
else :
        print('请求失败!')

利用response.text可以返回网页的HTML文本。
HTML文本

如图所示。
该图信息我们也可以通过打开网页进入开发者模式查看。
当我们获取了HTML的超文本信息后,这些信息是该网页界面的所有信息,存在我们需要的信息,同时也有超多的无用信息,为了在这些无用信息中找到我们需要的信息。所以接下来我们需要把HTML传给BeautifulSoup来解析。

5.解析HTML信息

soup = BeautifulSoup(response.text,'html.parser')
html.parser' 是 Python 的 BeautifulSoup 库中的一个解析器(parser),用于将 HTML 文本转换为一个可以操作的 BeautifulSoup 对象。具体来说,'html.parser' 的作用是告诉 BeautifulSoup 使用 Python 内置的 HTML 解析器来解析网页内容。解析器的功能是将原始的 HTML 文本转换为一个树状结构,方便进一步的搜索、提取和修改 HTML 元素。
完成这些操作后,我们打开目标网页然后进入开发者模式。点击箭头指向的位置,此时我们我的点击网页的内容就可以找到相对应的HMTL文本。
红楼梦

如:我们点击“红楼梦”
点击”红楼梦“

这样我们就找到了"红楼梦"的HMTL信息。
从图片中的信息我们可以看出,书籍的名称都是隶属于div class="pl2",为了获取书籍名称,我们需要使用soup.select('.pl2')
select('.pl2') 是 BeautifulSoup 中用来通过 CSS 选择器选择 HTML 元素的方法。在这个表达式中,.pl2 是一个 CSS 类选择器,表示选择所有具有 class="pl2" 属性的元素。会返回一个包含所有匹配元素的列表。如果没有找到任何匹配的元素,返回的列表会是空的。如果找到了多个匹配的元素,它会返回所有匹配项的列表。这样我们就找找到了该页面的所有书名了。
接下来就是各个书名所对应的链接了,还是观察上图,可以发现"红楼梦"的链接就上方。

<a href="https://book.douban.com/subject/1007305/" onclick="&quot;moreurl(this,{i:'0'})&quot;" title="红楼梦">

那么我们继续使用soup.select来匹配元素,因为我们需要在pl2内的a标签。
soup.select('.pl2 a') 是通过 CSS 选择器查找特定的元素,表示选择所有属于类名为 pl2 的元素内部的 <a> 标签。

完成上面的操作后我们就得到了两个列表,一个存储的书名大概信息,一个存储的书名所对应的链接大概信息。现在为了获取书名的具体信息我们还需要在使用xxx.text.strip()来进行无效数据的清除。
book_name.texttext 属性用于获取 HTML 元素中的纯文本内容。它会忽略 HTML 标签,只提取标签内部的文本。
book_name.text.strip()strip()是用于从 HTML 元素中提取纯文本并去除前后空白字符的常见操作
book_url['href'] 是用来提取 HTML 元素中 href 属性值的常见方式,通常用于获取超链接地址(URL)。这在使用 BeautifulSoup 解析 HTML 时非常常见。

6.清除多余的空白信息

完成上面的操作后如果我们直接把book_name.text.strip(),book_url['href']打印后回发现存在许多空白和换行,使得信息分布很零散。为了解决这个问题,我们就需要用到re个包了。

clean_data = re.sub(r'\s+', ' ', data) # 将多个空格、换行替换为单个空格

做完这些我们的爬虫程序就已经完成了,最后如果你需要把数据存储在到文件中就执行相对应的操作就可以了。

7.最终结果演示

请求成功!
https://book.douban.com/top250?start=0
1: 红楼梦 url: https://book.douban.com/subject/1007305/
2: 活着 url: https://book.douban.com/subject/4913064/
3: 1984 Nineteen Eighty-Four url: https://book.douban.com/subject/4820710/
4: 哈利·波特 Harry Potter url: https://book.douban.com/subject/24531956/
5: 三体全集 : 地球往事三部曲 url: https://book.douban.com/subject/6518605/
6: 百年孤独 Cien años de soledad url: https://book.douban.com/subject/6082808/
7: 飘 Gone with the Wind url: https://book.douban.com/subject/1068920/
8: 动物农场 Animal Farm url: https://book.douban.com/subject/2035179/
9: 房思琪的初恋乐园 url: https://book.douban.com/subject/27614904/
10: 三国演义(全二册) url: https://book.douban.com/subject/1019568/
11: 福尔摩斯探案全集(上中下) url: https://book.douban.com/subject/1040211/
12: 白夜行 白夜行 url: https://book.douban.com/subject/10554308/
13: 小王子 Le Petit Prince url: https://book.douban.com/subject/1084336/
14: 安徒生童话故事集 url: https://book.douban.com/subject/1046209/
15: 呐喊 url: https://book.douban.com/subject/1449351/
16: 天龙八部 url: https://book.douban.com/subject/1255625/
17: 撒哈拉的故事 url: https://book.douban.com/subject/1060068/
18: 邓小平时代 Deng Xiaoping and the Transformation of China url: https://book.douban.com/subject/20424526/
19: 悉达多 : 一首印度的诗 Siddhartha url: https://book.douban.com/subject/26980487/
20: 杀死一只知更鸟 To Kill a Mocking Bird url: https://book.douban.com/subject/6781808/
21: 失踪的孩子 : 那不勒斯四部曲4 Storia della bambina perduta url: https://book.douban.com/subject/30172069/
22: 明朝那些事儿(1-9) : 限量版 url: https://book.douban.com/subject/3674537/
23: 新名字的故事 : 那不勒斯四部曲2 Storia del nuovo cognome url: https://book.douban.com/subject/26986954/
24: 野草 url: https://book.douban.com/subject/1915958/
25: 沉默的大多数 : 王小波杂文随笔全编 url: https://book.douban.com/subject/1054685/
https://book.douban.com/top250?start=25
26: 中国历代政治得失 url: https://book.douban.com/subject/1003479/
27: 局外人 L'Etranger url: https://book.douban.com/subject/4908885/
28: 卡拉马佐夫兄弟 БРАТЬЯ КАРАМАЗОВЫ url: https://book.douban.com/subject/25887924/
29: 白鹿原 : 20周年精装典藏版 url: https://book.douban.com/subject/10564071/
30: 人类简史 : 从动物到上帝 Sapiens: A brief history of humankind url: https://book.douban.com/subject/25985021/
31: 平凡的世界(全三部) url: https://book.douban.com/subject/1200840/
32: 彷徨 url: https://book.douban.com/subject/1449348/
33: 乡土中国 url: https://book.douban.com/subject/1795079/
34: 罗杰疑案 : 阿加莎·克里斯蒂作品02 The Murder of Roger Ackroyd url: https://book.douban.com/subject/21371175/
35: 围城 url: https://book.douban.com/subject/1008145/
36: 我与地坛 : 史铁生代表作 url: https://book.douban.com/subject/1209899/
37: 许三观卖血记 url: https://book.douban.com/subject/4760224/
38: 笑傲江湖(全四册) url: https://book.douban.com/subject/1002299/
............

代码

import requests
import re
from bs4 import BeautifulSoup
i = 1
def catchBook(response):
    soup = BeautifulSoup(response.text,'html.parser')
    for book_name,book_url in zip(soup.select('.pl2'),soup.select('.pl2 a')):
         global i
         name_clean_data = re.sub(r'\s+', ' ', book_name.text.strip())
         url_clean_data = re.sub(r'\s+', ' ', book_url['href'])
         print(f'{i}:',name_clean_data,"url:",url_clean_data)
         i+=1

#目标网站:豆瓣读书
url = 'https://book.douban.com/top250?start='

#伪造为浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

#获取HTML文本
response = requests.get(url,headers=headers)
if response.status_code == 200:
    print('请求成功!')
    for num in range(0,10):
        newurl = url+str(num*25)
        print(newurl)
        newresponse = requests.get(newurl,headers=headers)
        catchBook(newresponse)
else :
        print('请求失败!')


http://www.kler.cn/news/354762.html

相关文章:

  • C++简单多状态dp:按摩师、打家劫舍II、删除并获得点数、粉刷房子
  • 2024全新UI网址发布页源码带黑夜模式
  • WebSocket介绍和入门案例
  • xavier 在tensorflow pytorch中的应用,正太分布和均匀分布的计算公式不一样
  • 串的模式匹配算法_BF算法
  • 【实战案例】SpringBoot项目中异常处理通用解决方案
  • 单片机原理与应用——嵌入式系统中的核心控制器
  • MySQL从入门到跑路
  • 干货|antd组件库Table组件开启虚拟列表的影响
  • 深度解析RLS(Recursive Least Squares)算法
  • 【Spring篇】初识之Spring的入门程序及控制反转与依赖注入
  • 如何利用被动DNS(Passive DNS)加强网络安全
  • STM32学习笔记---RTC
  • 中级注册安全工程师《安全生产法律法规》真题及详解
  • 48 | 代理模式:代理在RPC、缓存、监控等场景中的应用
  • 分布式管理工具分析:Java、Go 和 Python
  • 【vue】keep-alive动态组件的基础用法
  • 【text2sql】基于上下文文学习的MCS-SQL框架在Spider和BIRD取得了新SOTA
  • 线性可分支持向量机的原理推导
  • Android Jetpack组件库中的LiveData和ViewModel的作用。