python爬取豆瓣图书前250

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

最近在学习python爬虫系列课程,也在学习写一些程序实例,这篇文章是爬取豆瓣图书的前250本数的名称和其他信息。


前期准备

1.安装适合的python编辑器,本人使用的是Anaconda中的Jupyter Notebook,因为便于编写和管理python的各种第三方库,所以推荐大家也使用。下载地址为:https://www.anaconda.com/download/

2.本文章要使用python库中的requests和BeautifulSoup4库爬取网页和解析网页。因为不是python自带的标准库,所以要手动安装以上两个库。

3.用pip安装以上两个库,Win+R打开输入cmd, 输入如下:

pip install requests
pip install beautifulsoup4

网页分析

下面我们开始我们的爬虫程序主体,我们将要访问的是豆瓣图书的前250榜单的书名和其他信息

https://book.douban.com/top250?

如下图:


下面我们检索我们所需要的字段所在的标签,右键打开源代码检查元素,我们以查询“追风筝的人”书名为例查找所在的标签;如下图:


我们可以看到所有的字段都存储在标签div{'class':'indent'}中,每个字段都在各个table标签中,书名称在div{'class':'p12'}的a 标签中,其他信息在p标签中{’class':'pl'}中。如下图:


下面我们还要看到250本书在10个页面中,要全部爬取下来我们还需要观察更多的网页结构:

第一个网页的链接为:https://book.douban.com/top250?

第二个网页的链接为:https://book.douban.com/top250?start=25

第三个网页的链接为:https://book.douban.com/top250?start=50

我们可以发现第二、三页链接上有个start=?,可以判断为每页的起始值为0,25,50...

上面的每页都有类似的结构,我们可以开始编写我们的主程序。


程序结构

先导入我们所需要的requests库Beautiful Soup库;

import requests

from bs4 import BeautifulSoup

然后来编写我们程序的主体框架;

def getHTMLText(url):                      #获得所需要的网页页面信息
    return

def get_data(list,html):                   #从网页中获取页面信息,并存入列表中
    return

def print_data(list):                      #将存储在列表中的信息输出打印出来

def main():
main()

接下来我们根据各个函数的目的,填充函数内的内容,第一个函数是要获取页面的信息;

def getHTMLText(url):
    try:
        r = requests.get(url ,timeout = 30)
        r.raise_for_status()
        r.encoding =r.apparent_encoding
        return r.text
    except:
        return "产生异常"

第二个函数是要获取数据,并存储在列表中;

def get_data(list,html):
    tables = BeautifulSoup(html, 'html.parser').find('div',  {'class':'indent'}).find_all('table')
    #在div标签中找到所有的table标签
 for table in tables:            #在所有的table标签中遍历元素
        title = table.find('div', {'class':'pl2'}).find('a').get_text()  #找到书名所在的a标签
        info = table.find('p', {'class':'pl'}).get_text()                #找到其他信息所在的p标签
        list.append([title.strip(),info.strip()])            #将其存储列表,用strip()出去其中的空字符串

第三个函数是将列表中的数据输出打印出来;

def print_data(list):
    print("{:^6}\t{:^10}\t{:^16}".format('序号','书名','信息'))
    count = 0                                        #用count来表示爬取的序号
    for b in list:
        count += 1
        print("{:^6}\t{:^16}\t{:^16}".format(count,b[0],b[1]))

最后我们来编写主函数;

def main():
    start_url = 'https://book.douban.com/top250?'           #这是起始也的url
    depth = 10                                              #我们爬取的深度为10页
    info_list = []
    for i in range(depth):                                 #在每页中进行遍历
        url = start_url + str(25*i)                        #实际的url是原始url加上start=?
        html = getHTMLText(url)                            #解析每页的网页信息
        get_data(info_list,html)                           #获取数据
    print_data(info_list)                                  #打印输出最后的列表
main()

上面我们就全部编写完成这个爬虫程序,输出如下;


上面我们爬取的250本的豆瓣图书信息,但是不知道为什么我们使用的strip()除去空字符,在三体这本书还是有空字符存在。希望大家指点方法解决。

程序代码

上面我们成功的写完了豆瓣爬虫的代码,并成功输出了我们大致所要的结果,全部代码如下;

import requests
from bs4 import BeautifulSoup

def getHTMLText(url):
    try:
        r = requests.get(url ,timeout = 30)
        r.raise_for_status()
        r.encoding =r.apparent_encoding
        return r.text
    except:
        return "产生异常"

def get_data(list,html):
    tables = BeautifulSoup(html, 'html.parser').find('div',  {'class':'indent'}).find_all('table')
    for table in tables:   
        title = table.find('div', {'class':'pl2'}).find('a').get_text()
        info = table.find('p', {'class':'pl'}).get_text()
        list.append([title.strip(),info.strip()])

def print_data(list):
    print("{:^6}\t{:^10}\t{:^16}".format('序号','书名','信息'))
    count = 0
    for b in list:
        count += 1
        print("{:^6}\t{:^16}\t{:^16}".format(count,b[0],b[1]))
    
def main():
    start_url = 'https://book.douban.com/top250?'
    depth = 10
    info_list = []
    for i in range(depth):
        url = start_url + str(25*i)
        html = getHTMLText(url)
        get_data(info_list,html)
    print_data(info_list)
main()

总结

1.爬虫主要用requests库和Beautiful Soup库可以简明地爬取网页上的信息;

2.先定好程序主要框架,再根据目的需求填充函数内容:获取网页信息>爬取网页数据>打印输出;

3.对于所有的信息存储于多页,要观察网页信息,构造每页的url链接来解决;

3.最重要的是解析网页结构,最好可以用标签树的形式确定字段所在的标签,并遍历全部标签存储数据。


本人学习的python也不太久,文章中有些理解和书写错误,还望大家理解和之处,谢谢!
另外,强烈推荐北京理工大学嵩天老师的python系列课程。
更多关于本人的信息请访问本人网站 http://www.o-xunkhun.com/(目前处于申请维护状态)

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值