当前位置:   article > 正文

python爬虫篇(知识讲解+爬取小说)_爬小说 python

爬小说 python

最近博主学习了基本的爬虫知识,制作了几个爬虫脚本,感觉基础部分相对比较容易一些,这里分享给大家。

大家谨记爬虫只是用来方便大家从互联网上检索信息,获取免费资源,不得以危害或者窃取对方资源使用为目的进行违法犯罪。牢记网络安全法。

1.爬虫的准备工作

安装第三方库-requests lxml

使用pip命令直接安装requests

  1. pip install requests
  2. pip install lxml

如果出现失败,请检查网络,或者换源使用阿里云下载(直接换源比较推荐)。

2.爬虫介绍以及基本使用到的方法介绍

概念:(爬虫又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。

简单来说就是模拟用户登录,然后批量次的下载网络数据基本的使用方法分为post 和 get 两种请求,

介绍:

GET请求:

  • GET请求用于从服务器获取数据。
  • GET请求将参数附加在URL的末尾,以查询字符串的形式发送给服务器。
  • GET请求的参数信息可以在URL中被看到,因此不适合传输敏感信息。
  • GET请求可以通过浏览器直接访问和书签保存。
  1. import requests
  2. # 发送GET请求
  3. response = requests.get('https://api.example.com/data', params={'key': 'value'})
  4. # 获取响应数据
  5. data = response.text
  6. # 处理响应数据...

POST请求:

  • POST请求用于向服务器提交数据。
  • POST请求将参数包含在请求体中,不会暴露在URL上。
  • POST请求适合传输敏感信息,如用户的用户名和密码等。
  • POST请求不能通过浏览器直接访问和书签保存。
  1. import requests
  2. # 发送POST请求
  3. data = {'key': 'value'}
  4. response = requests.post('https://api.example.com/submit', data=data)
  5. # 获取响应数据 一般情况下是json格式的,具体我会说明怎么查看
  6. result = response.json()
  7. # 处理响应数据...

任务

打开百度的搜索界面,将百度的源代码爬取下来,观察爬取的代码中是否有不同

  1. import requests
  2. url = "https://www.baidu.com/"
  3. response = requests.get(url)
  4. print(response.text)

我们会发现代码中存在一些乱码问题,如何避免这个问题呢?使用encoding = 'utf-8'解决

  1. import requests
  2. url = "https://www.baidu.com/"
  3. response = requests.get(url)
  4. response.encoding = 'utf-8'
  5. print(response.text)

 此时我们发现代码并没有出现错误的情况。

有时候我们会发现爬取代码的时候,当我们使用get请求或者是post请求访问对方网站的时候出现拒绝,此时我们需要使用UA伪装来爬取

UA伪装的定义

UA伪装(User-Agent Spoofing)是一种网络技术手段,用于隐藏或修改用户的浏览器标识信息(User-Agent),以伪装成其他设备、操作系统或浏览器。User-Agent是HTTP请求头中的一部分,用于向服务器提供有关客户端的信息,包括设备类型、操作系统和浏览器类型等。通过伪装User-Agent,可以使服务器误认为请求来自于不同的设备或软件。

UA伪装在网络爬虫、数据采集、网页测试等场景中被广泛使用。通过伪装User-Agent,可以绕过一些网站的限制或访问控制,获取更多的信息或实现特定的功能。然而,UA伪装也可能被滥用,用于恶意攻击、欺骗或非法活动,因此在使用时需要遵守相关法律法规并谨慎使用。

实际上你只需要知道,UA伪装主要是帮你通过一部分反爬虫的拦截就可以了,具体内容不需要过多研究。

那要怎么写呢?

我们直接右键百度界面,打开开发者工具找到网络,随便打开一个文件,然后拉到最下面,找到我箭头指向的user-agent然后直接创建一个新的字典类型的数据,然后把这个以字符串的形式存进去即可。

此时我们只需要在get中加入这个新的字典对象就可以增加爬取的成功性了

  1. import requests
  2. url = "https://www.baidu.com/"
  3. headers = {
  4. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
  5. }
  6. response = requests.get(url,headers=headers)
  7. response.encoding = 'utf-8'
  8. print(response.text)

处理爬取到的数据

当我们把爬取到的源代码放到html文件中格式化后,我们会发现实际上的代码量是非常大的,如果去源代码中查找的话你需要浪费很多时间,这里建议大家使用浏览器自带的开发工具。f12或者右键检查。

使用流程:

这里要使用到我们之前安装的lxml库。具体使用的是库中的etree模块

这里简单介绍一下操作HTML的基本用法:

在Python中,可以使用`lxml`库中的`etree`模块来操作HTML文档。`etree`提供了一组强大的工具和方法,使得解析、遍历和修改HTML文档变得简单和方便。

下面是使用`etree`操作HTML的基本用法:

1. 导入必要的模块:

from lxml import etree

2. 解析HTML文档:

  1. html = """
  2. <html>
  3.   <body>
  4.     <div class="container">
  5.       <h1>Title</h1>
  6.       <p>Paragraph 1</p>
  7.       <p>Paragraph 2</p>
  8.     </div>
  9.   </body>
  10. </html>

3.查找元素:

  1. # 使用XPath查找元素
  2. elements = tree.xpath("//p") # 查找所有 <p> 元素
  3. for element in elements:
  4. print(element.text) # 输出元素文本内容
  5. # 使用CSS选择器查找元素
  6. elements = tree.cssselect("div.container h1") # 查找 <div class="container"> 下的 <h1> 元素
  7. for element in elements:
  8. print(element.text) # 输出元素文本内容

只需要学会这几个简单的使用,本博客需要用到的知识就够了。主要是带着大家爬取一些内容,进行实战,找到几种类型就可以了。

1.爬取笔趣阁小说。

学习一下思路:

1.我们进入需要爬取到的小说界面,右键开发者工具 ,选中元素显示,然后找到需要爬取的小说章节模块在代码中的位置。

将a标签中的文本内容复制,然后ctrl+u打开源代码 ctrl+f将刚刚的文本内容复制查找是否有这个模块。(比较爽的是,刚好这里有,可以不需要去查看网络请求和script代码了)

那么我们现在可以可以来获取源代码了

  1. import requests
  2. from lxml import etree
  3. # 网页网址(指向小说章节的那部分)
  4. url = "https://www.bige3.cc/book/3319/"
  5. #UA伪装
  6. headers = {
  7. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
  8. }
  9. #获取源代码请求 注意参数的书写
  10. response = requests.get(url,headers=headers)
  11. #源代码的具体编码格式建议先看一下网页中的meta设置的编码格式 meta中的charset
  12. response.encoding = 'utf-8'
  13. #赋值
  14. webCode = response.text

编码格式的查看方式。

获取源代码之后,我们现在需要去解析一下这串源代码,这里需要一点前端知识,不懂得去看我之前的博客,那上面有详细的记载。如果不想学的话,还有一种更简单的方式来获取。

选中这个章节,你现在需要做的是右键->复制->复制xPath 然后回到python代码中按照格式填写即可

实例图

复制粘贴基本成功

  1. import requests
  2. from lxml import etree
  3. # 网页网址(指向小说章节的那部分)
  4. url = "https://www.bige3.cc/book/3319/"
  5. #UA伪装
  6. header = {
  7. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
  8. }
  9. #获取源代码请求 注意参数的书写
  10. response = requests.get(url,headers=header)
  11. #源代码的具体编码格式建议先看一下网页中的meta设置的编码格式 meta中的charset
  12. response.encoding = 'utf-8'
  13. #赋值
  14. webCode = response.text
  15. #创建一个etree对象
  16. en = etree.HTML(webCode)
  17. li = en.xpath('//div[@class = "listmain"]/dl/dd[1]/a//@href')
  18. #创建新的url请求
  19. print(li)
  20. newUrl = "https://www.bige3.cc"+li[0]
  21. print(newUrl)
  22. note = requests.get(newUrl)
  23. print(note.text)

打印后我们可以获取到这个章节对应的网页信息。

我们需要的小说,所以现在我们需要解析note,通过下面的信息,我们可以发现需要的文字在一个div中的文字形式,所以直接解析获取文本即可。重复上面步骤,按照相同的代码结构进行书写。

完整代码

  1. import requests
  2. from lxml import etree
  3. # 网页网址(指向小说章节的那部分)
  4. url = "https://www.bige3.cc/book/3319/"
  5. #UA伪装
  6. header = {
  7. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
  8. }
  9. #获取源代码请求 注意参数的书写
  10. response = requests.get(url,headers=header)
  11. #源代码的具体编码格式建议先看一下网页中的meta设置的编码格式 meta中的charset
  12. response.encoding = 'utf-8'
  13. #赋值
  14. webCode = response.text
  15. #创建一个etree对象
  16. en = etree.HTML(webCode)
  17. li = en.xpath('//div[@class = "listmain"]/dl/dd[1]/a//@href')
  18. #创建新的url请求
  19. newUrl = "https://www.bige3.cc"+li[0]
  20. note = requests.get(newUrl)
  21. note.encoding = 'utf-8'
  22. noteText = etree.HTML(note.text).xpath('//div[@id="chaptercontent"]/text()')
  23. for t in noteText:
  24. with open("小说.txt",'a',encoding='utf-8') as file:
  25. file.write(t)
  26. file.write('\n')
  27. print("成功下载")

效果展示:

那么如果我需要爬取一整书籍呢?

我们再来看一下目录的结构。每一章节对应的链接所在的结构都是一样的,全部存在于dl->dt->dd->a->href 所以我只需要获取全部的dd标签,然后一个for循环遍历所有的dd标签,然后内部再写一个for循环,即可获取正本书籍

获取整本书的代码:

  1. import requests
  2. from lxml import etree
  3. # 网页网址(指向小说章节的那部分)
  4. url = "https://www.bige3.cc/book/3319/"
  5. #UA伪装
  6. header = {
  7. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
  8. }
  9. #获取源代码请求 注意参数的书写
  10. response = requests.get(url,headers=header)
  11. #源代码的具体编码格式建议先看一下网页中的meta设置的编码格式 meta中的charset
  12. response.encoding = 'utf-8'
  13. #赋值
  14. webCode = response.text
  15. #创建一个etree对象
  16. en = etree.HTML(webCode)
  17. #获取全部的dd标签
  18. li = en.xpath('//div[@class = "listmain"]//dl//dd')
  19. index = 0
  20. bookLen = len(li)
  21. for i in li:
  22. #创建新的url请求
  23. try:
  24. # 解析dd 这里为什么不需要书写etreed对象获取呢?
  25. # 因为li数组本身就是一个解析后的etree元素列表,
  26. # 所以i本身就是一个etree元素,可以直接使用xpath
  27. #这里注意使用[0] xpath解析获取到的都是数组形式
  28. bookWeb = i.xpath("./a/@href")[0]
  29. newUrl = "https://www.bige3.cc"+ bookWeb
  30. note = requests.get(newUrl)
  31. note.encoding = 'utf-8'
  32. noteText = etree.HTML(note.text).xpath('//div[@id="chaptercontent"]/text()')
  33. for t in noteText:
  34. with open("小说.txt",'a',encoding='utf-8') as file:
  35. file.write(t)
  36. file.write('\n')
  37. print(f"书本下载({index}/{bookLen})")
  38. index+=1
  39. except:
  40. print("章节下载失败")

提高效率(对对方服务器危害较大,线程数量尽量使用小一点的)

我们会发现当将写入小说的部分注释掉,将url打印时我们会发现,几乎2-3s就可以全部打印,写文件是最耗费时间的,所以一个线程肯定是不够的,这里需要用到多线程提高效率,不会的可以去学一下线程池的使用。 我们发现这个文章是乱序的,这是由于并发引起的,可以加入互斥锁进行爬取。

  1. import requests
  2. from lxml import etree
  3. from concurrent.futures import ThreadPoolExecutor
  4. def download_chapter(chapter_url):
  5. try:
  6. response = requests.get(chapter_url, headers=header)
  7. response.encoding = 'utf-8'
  8. noteText = etree.HTML(response.text).xpath('//div[@id="chaptercontent"]/text()')
  9. with open("小说.txt", 'a', encoding='utf-8') as file:
  10. for t in noteText:
  11. file.write(t + '\n')
  12. print(f"章节 {chapter_url} 下载完成")
  13. except Exception as e:
  14. print(f"章节 {chapter_url} 下载失败:{e}")
  15. if __name__ == "__main__":
  16. url = "https://www.bige3.cc/book/3319/"
  17. header = {
  18. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
  19. }
  20. response = requests.get(url, headers=header)
  21. response.encoding = 'utf-8'
  22. webCode = response.text
  23. en = etree.HTML(webCode)
  24. li = en.xpath('//div[@class = "listmain"]//dl//dd')
  25. chapter_urls = ["https://www.bige3.cc" + item.xpath("./a/@href")[0] for item in li]
  26. with ThreadPoolExecutor(max_workers=5) as executor: #根据需求加入线程大小
  27. executor.map(download_chapter, chapter_urls)

用于迁出博客

var code = "1689b347-3417-4c5b-ab2f-ac75516b5030"

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/558178
推荐阅读
相关标签
  

闽ICP备14008679号