Python中的爬虫实战:豆瓣图书爬虫

2024-06-23 15:36

本文主要是介绍Python中的爬虫实战:豆瓣图书爬虫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python是当今最热门的编程语言之一,在不同的领域都得到了广泛的应用,如数据科学、人工智能、网络安全等。其中,python在网络爬虫领域表现出色,许多企业和个人利用python进行数据采集和分析。本篇文章将介绍如何使用python爬取豆瓣图书信息,帮助读者初步了解python网络爬虫的实现方法和技术。

首先,对于豆瓣图书信息爬虫,我们需要用到Python中的两个重要的库:urllib和beautifulsoup4。其中,urllib库主要用于网络请求和数据读取,而beautifulsoup4库则可用于解析HTML和XML等结构化文档,从而提取需要的信息。在使用这些库之前,我们需要先安装它们,使用pip命令即可完成安装。安装完成后,就可以开始我们的实战了。

1.确定爬取目标

在使用Python进行爬虫时,首先需要明确爬取目标。对于本篇文章而言,我们的目标是爬取豆瓣图书的基本信息,如书名、作者、出版社、出版日期、评分等。此外,我们还需要爬取多页图书信息。

2.分析HTML结构

确定了爬取目标之后,我们需要进一步分析豆瓣图书的HTML结构,以便确定所需信息的位置和特征。我们可以使用Chrome或Firefox等浏览器自带的开发者工具来查看页面源代码。通过观察HTML结构,我们可以找到需要爬取的标签和属性,进而编写Python代码进行实现。

3.编写代码

接下来,我们在Python中编写豆瓣图书爬虫代码。代码的核心是:

  • 发送网络请求并获取HTML页面;
  • 解析HTML文档,提取所需信息;
  • 存储数据。

下面是完整代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

import urllib.request

from bs4 import BeautifulSoup

url = 'https://book.douban.com/top250'

books = []

def get_html(url):

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'}

    req = urllib.request.Request(url, headers=headers)

    response = urllib.request.urlopen(req)

    html = response.read().decode('utf-8')

    return html

def parse_html(html):

    soup = BeautifulSoup(html,'html.parser')

    book_list_soup = soup.find('div', attrs={'class': 'article'})

    for book_soup in book_list_soup.find_all('table'):

        book_title_soup = book_soup.find('div', attrs={'class': 'pl2'})

        book_title_link = book_title_soup.find('a')

        book_title = book_title_link.get('title')

        book_url = book_title_link.get('href')

        book_info_soup = book_soup.find('p', attrs={'class': 'pl'})

        book_info = book_info_soup.string.strip()

        book_rating_num_soup = book_soup.find('span', attrs={'class': 'rating_nums'})

        book_rating_num = book_rating_num_soup.string.strip()

        book_rating_people_num_span_soup = book_soup.find('span', attrs={'class': 'pl'})

        book_rating_people_num = book_rating_people_num_span_soup.string.strip()[1:-4]

        book_author_and_publish_soup = book_soup.find('p',attrs={'class':'pl'}).next_sibling.string.strip()

        book_author_and_publish = book_author_and_publish_soup.split('/')

        book_author = book_author_and_publish[0]

        book_publish = book_author_and_publish[-3]

        book_year = book_author_and_publish[-2]

        books.append({

        'title': book_title,

        'url': book_url,

        'info': book_info,

        'author':book_author,

        'publish':book_publish,

        'year':book_year,

        'rating_num':book_rating_num,

        'rating_people_num':book_rating_people_num

        })

def save_data():

    with open('douban_top250.txt','w',encoding='utf-8') as f:

        for book in books:

            f.write('书名:{0}

'.format(book['title']))

            f.write('链接:{0}

'.format(book['url']))

            f.write('信息:{0}

'.format(book['info']))

            f.write('作者:{0}

'.format(book['author']))

            f.write('出版社:{0}

'.format(book['publish']))

            f.write('出版年份:{0}

'.format(book['year']))

            f.write('评分:{0}

'.format(book['rating_num']))

            f.write('评分人数:{0}

'.format(book['rating_people_num']))

if __name__ == '__main__':

    for i in range(10):

        start = i*25

        url = 'https://book.douban.com/top250?start={0}'.format(start)

        html = get_html(url)

        parse_html(html)

    save_data()

代码解析:

首先,我们定义一个主网址url和一个空列表books(用于存储图书信息)。接着,我们编写get_html函数,用于发送请求并获取HTML页面。在该函数中,我们设置了请求头headers,以模拟浏览器发送请求,从而避免被网站屏蔽。我们使用urllib库的Request方法,将请求头和网址封装到一个对象中,然后使用urllib库的urlopen方法,发送网络请求并获取页面,最后使用read和decode方法,将页面内容转换成utf-8格式的字符串。

我们编写parse_html函数,用于解析HTML文档,提取所需信息。在该函数中,我们使用beautifulsoup4库的find和find_all方法,查找HTML页面中符合要求的标签和属性。具体地,我们通过观察豆瓣图书的HTML结构,找到了每本图书所在的table标签和对应的书名、链接、信息和评分等信息,并编写了提取这些数据的代码。其中,我们使用了strip和split方法,对字符串进行处理,以去除多余空白字符和分割字符串。

最后,我们编写了save_data函数,用于将提取的图书信息存储到本地文件中。在该函数中,我们使用Python内置函数open,打开一个文本文件,以写入模式写入文件内容,并使用format方法,将每本图书的相关信息格式化为字符串,写入文件。注意,我们需要在文件名后面加上编码方式encoding='utf-8',以确保文件内容不会出现乱码。

在主程序中,我们使用for循环,爬取豆瓣图书的前250本图书。为此,我们需要每页爬取25本图书,共爬取10页。在每个循环中,我们根据当前页码计算出所需的url,并调用get_html函数,获取HTML页面。接着,我们将页面传递给parse_html函数,解析页面并提取所需信息。最后,我们调用save_data函数,将所有图书信息保存到本地文件中。

4.运行代码

在完成代码编写后,我们可以在命令行(Windows系统)或终端(MacOS或Linux系统)中进入代码所在目录,并执行命令python3 爬虫脚本名.py,即可运行该Python网络爬虫。在程序运行期间,我们可以观察程序的输出信息,以判断程序是否正确执行。程序执行完毕后,我们可以检查本地文件douban_top250.txt,确认是否已成功保存数据。

总结

通过本篇文章的介绍,我们初步了解了Python网络爬虫的实现方法和技术。具体而言,我们使用Python中的urllib和beautifulsoup4库,针对豆瓣图书网站的HTML结构,编写了爬取豆瓣图书信息的Python程序,成功实现了数据采集和存储。此外,在实际应用中,我们需要了解一些网络爬虫的注意事项,如不要过度频繁地向同一网站发送请求,以避免被封IP地址。

这篇关于Python中的爬虫实战:豆瓣图书爬虫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087560

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互