本文的目标是爬取豆瓣读书的top250书籍名称以及对应网址
🌈个人主页:Yui_
🌈Linux专栏:Linux
🌈C语言笔记专栏:C语言笔记
🌈数据结构专栏:数据结构
🌈C++专栏:C++
文章目录
1.前言
网络爬虫(Web Crawler),也称为网络蜘蛛(Web Spider)或网络机器人(Web Bot),是一种自动化程序,用于从网站中提取和收集信息。它通过系统地浏览互联网,访问网页并提取其中的内容,常用于搜索引擎、数据挖掘以及其他需要大量信息的场景。
工作原理
- 种子URL:爬虫通常从一个或多个种子URL(即初始网页)开始。
- 抓取页面:爬虫访问种子URL并下载网页内容,这个过程类似于用户在浏览器中打开网页。
- 解析内容:解析HTML或其他格式的内容,提取有价值的信息(如文本、图片、链接等)。
- 获取新链接:从已抓取的网页中提取链接,然后爬虫会继续访问这些新的链接,形成爬取的循环。
- 存储数据:爬虫提取的信息会被保存到数据库或文件中,供后续分析或使用。
常见应用
- 搜索引擎:Google、Bing等搜索引擎通过网络爬虫抓取网页内容,构建搜索索引,以便用户能够搜索到最新的信息。
- 数据收集和分析:许多企业和研究机构使用爬虫获取市场趋势、社交媒体数据、价格信息等。
- 内容聚合:新闻聚合网站、比价网站利用爬虫收集来自不同来源的内容。
常用技术与工具
- Requests 和 BeautifulSoup:
Requests
用于发送HTTP请求,BeautifulSoup
用于解析HTML文档。适合于小型爬虫任务。- Scrapy:一个流行的Python爬虫框架,提供强大的功能,适用于大型、复杂的爬虫项目。
- Selenium:适用于需要模拟用户行为、抓取动态内容的场景。它可以与浏览器集成,模拟用户操作。
爬虫的挑战
- 反爬虫机制:许多网站设置了限制或防御机制,防止过度爬取。例如,通过CAPTCHA、IP封禁、请求频率限制等方式。
- 动态内容:一些网站使用JavaScript动态加载内容,这使得传统的爬虫难以获取全部信息。
- 法律和道德:爬虫行为受法律和网站协议(如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传给
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=""moreurl(this,{i:'0'})"" title="红楼梦">
那么我们继续使用
soup.select
来匹配元素,因为我们需要在
pl2
内的a标签。
soup.select('.pl2 a')
是通过 CSS 选择器查找特定的元素,表示选择所有属于类名为
pl2
的元素内部的
<a>
标签。
完成上面的操作后我们就得到了两个列表,一个存储的书名大概信息,一个存储的书名所对应的链接大概信息。现在为了获取书名的具体信息我们还需要在使用
xxx.text.strip()
来进行无效数据的清除。
**
book_name.text
**:
text
属性用于获取 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 =1defcatchBook(response):
soup = BeautifulSoup(response.text,'html.parser')for book_name,book_url inzip(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 inrange(0,10):
newurl = url+str(num*25)print(newurl)
newresponse = requests.get(newurl,headers=headers)
catchBook(newresponse)else:print('请求失败!')
版权归原作者 Yui_ 所有, 如有侵权,请联系我们删除。