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地址。

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值