Python基础之爬取豆瓣图书信息

概述

所谓爬虫,就是帮助我们从互联网上获取相关数据并提取有用的信息。在大数据时代,爬虫是数据采集非常重要的一种手段,比人工进行查询,采集数据更加方便,更加快捷。刚开始学爬虫时,一般从静态,结构比较规范的网页入手,然后逐步深入。今天以爬取豆瓣最受关注图书为例,简述Python在爬虫方面的初步应用,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

如果要实现爬虫,需要掌握的Pyhton相关知识点如下所示:

  • requests模块:requests是python实现的最简单易用的HTTP库,建议爬虫使用requests。关于requests模块的相关内容,可参考官方文档及简书上的说明
  • BeautifulSoup模块:Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。关于BeautifulSoup的更多内容,可参考官方文档
  • json模块:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。使用 JSON 函数需要导入 json 库。关于json的更多内容,可参考菜鸟笔记
  • re模块:re模块提供了与 Perl 语言类似的正则表达式匹配操作。关于re模块的更多内容,可参考官方文档

目标页面

本例中爬取的信息为豆瓣最受关注图书榜信息,共10本当前最受欢迎图书。

爬取页面URL【Uniform Resource Locator,统一资源定位器】:https://book.douban.com/chart?subcat=F

爬取页面截图,如下所示:

爬取数据步骤

1. 分析页面

通过浏览器提供的开发人员工具(快捷键:F12),可以方便的对页面元素进行定位,经过定位分析,本次所要获取的内容,包括在UL【class=chart-dashed-list】标签内容,每一本书,都对应一个LI元素,是本次爬取的目标,如下所示:

 

 每一本书,对应一个Li【class=media clearfix】元素,书名为对应a【class=fleft】元素,描述为P【class=subject-abstract color-gray】标签元素内容,具体到每一本书的的详细内容,如下所示:

 

2. 下载数据

如果要分析数据,首先要进行下载,获取要爬取的数据信息,在Python中爬取数据,主要用requests模块,如下所示:

 1 def get_data(url):
 2     """
 3     获取数据
 4     :param url: 请求网址
 5     :return:返回请求的页面内容
 6      7     # 请求头,模拟浏览器,否则请求会返回418
 8     header = {
 9         'User-Agent': Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) '
10                       Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363'}
11     resp = requests.get(url=url,headers=header)   发送请求
12     if resp.status_code == 200:
13          如果返回成功,则返回内容
14         return resp.text
15     else16          否则,打印错误状态码,并返回空
17         print(返回状态码:,resp.status_code)
18         return ''

注意:在刚开始写爬虫时,通常会遇到“HTTP Error 418”,请求网站的服务器端会进行检测此次访问是不是人为通过浏览器访问,如果不是,则返回418错误码。检测请求头是常见的反爬虫策略,所为为了模拟浏览器访问,需要构造请求Header,然后即可正常访问。

正常浏览器访问成功的状态码为200,及请求标头中User-Agent。如下所示:

 

3. 解析数据

当获取到数据后,需要进行数据分析,才能得到想要的内容。requests模块获取到的内容为Html源码字符串,可以通过BeautifulSoup装载成对象,然后进行数据获取,如下所示:

def parse_data(html: str = None):
    解析数据
    :param html:
    :return:返回书籍信息列表
 7     bs = BeautifulSoup(html,features=html.parser')   转换页面内容为BeautifulSoup对象
 8     ul = bs.find(name=ul',attrs={classchart-dashed-list'})   获取列表的父级内容
 9     lis = ul.find_all(li': re.compile(^media clearfix')})   获取图书列表
10     books = []   定义图书列表
11     for li in lis:
12          循环遍历列表
13         strong_num = li.find(name=strongfleft green-num-box 获取书籍排名标签
14         book_num = strong_num.text   编号
15         h2_a = li.find(name=afleft 获取书名标签
16         book_name = h2_a.text   获取书名
17         p_info = li.find(name=p"subject-abstract color-gray"})   书籍说明段落标签
18 
19         book_info_str = p_info.text.strip()   获取书籍说明,并 去前后空格
20          book_info_list = book_info_str.split('/',-1) # 分隔符
21         books.append(
22             {book_num': book_num,book_name': book_name,1)">book_info': book_info_str})   将内容添加到列表
23 
24     return books

4. 保存数据

解析到目标数据后,需要进行数据持久化,以便后续进一步分析。持久化通常可以保存到数据库中,本例为了简单,保存到本地json文件中,如下所示:

1  save_data(res_list):
2     3     保存数据
4     :param res_list: 保存的内容文件
5     :return:
6     7     with open(books.jsonwutf-8) as f:
8         res_list_json = json.dumps(res_list,ensure_ascii=False)
9         f.write(res_list_json)

本例完整代码,如下所示:

import json   json 包,用于读取解析,生成json格式的文件内容
 2 import requests   请求包  用于发起网络请求
 3 from bs4 import BeautifulSoup   解析页面内容帮助包
 4 import re   正则表达式
 5 
 6 
 7  8      9 10 11 12     13     14     header =15         16                       17     resp = requests.get(url=url,1)">18     19         21     22         23         24         ''
25 
26 
27 28     29 30 31 32     33     bs = BeautifulSoup(html,1)">34     ul = bs.find(name=35     lis = ul.find_all(36     books = []  37     38         39         strong_num = li.find(name=40         book_num = strong_num.text  41         h2_a = li.find(name=42         book_name = h2_a.text  43         p_info = li.find(name=44 
45         book_info_str = p_info.text.strip()  46         47 48             {49 
50      books
51 
52 
53 54     55 56 57 58     59     with open(60         res_list_json = json.dumps(res_list,1)">61         f.write(res_list_json)
62 
63 
64   开始执行,调用函数
65 url = https://book.douban.com/chart?subcat=F66 html = get_data(url=url)   获取数据
67 books = parse_data(html)   解析数据
68 save_data(books)   保存数据
69 done')
View Code

本例爬取内容,保存到books.json文件中,如下所示:

[
  {
 3     ": 1" 4     心灵侦探城塚翡翠 5     相泽沙呼 / 2021-4 / 人民文学出版社 / 79.00元 / 精装"
 6   },1)">2 9     平原上的摩西10     双雪涛 / 2021-4 / 北京日报出版社 / 59 / 精装11 12 13     314     眩晕15     [德国] 温弗里德·塞巴尔德 / 2021-4 / 广西师范大学出版社 / 52.00元 / 精装16 17 18     419     一把刀,千个字20     王安忆 / 2021-4 / 人民文学出版社 / 精装22 23     524     字母表谜案25     大山诚一郎 / 2021-5 / 河南文艺出版社 / 42.00 / 平装26 629     星之继承者30     [英] 詹姆斯·P.霍根 / 2021-4 / 新星出版社 / 58.00元 / 精装31 32 33     734     美丽黑暗35     [法] 法比安·韦尔曼  编 / [法] 凯拉斯科多  绘 / 2021-4 / 后浪丨中国纺织出版社 / 88.00元 / 精装36 37 38     839     40     [日] 夏目漱石 / 2021-3-30 / 江苏凤凰文艺出版社 / 45.00元 / 精装41 42 43     944     奇迹唱片行45     [英] 蕾秋·乔伊斯 / 2021-6-11 / 北京联合出版公司 / 48 / 平装46 48     1049     派对恐惧症50     [美]卡门•玛丽亚•马查多 / 2021-5 / 世纪文景/上海人民出版社 / 59.00元 / 精装51   }
52 ]
View Code

备注

望岳

唐·杜甫

岱宗夫如何?齐鲁青未了。
造化钟神秀,阴阳割昏晓。
荡胸生曾云,决眦入归鸟。( 曾 同:层)
会当凌绝顶,一览众山小。 

原文地址:https://www.cnblogs.com/hsiang

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用OpenCV实现视频去抖 整体步骤: 设置输入输出视频 寻找帧之间的移动:使用opencv的特征检测器,检测前一帧的特征,并使用Lucas-Kanade光流算法在下一帧跟踪这些特征,根据两组点,将前一个坐标系映射到当前坐标系完成刚性(欧几里得)变换,最后使用数组纪录帧之间的运动。 计算帧之间的平
前言 对中文标题使用余弦相似度算法和编辑距离相似度分析进行相似度分析。 准备数据集part1 本次使用的数据集来源于前几年的硕士学位论文,可根据实际需要更换。结构如下所示: 学位论文题名 基于卷积神经网络的人脸识别研究 P2P流媒体视频点播系统设计和研究 校园网安全体系的设计与实现 无线传感器网络中
前言 之前尝试写过一个爬虫,那时对网页请求还不够熟练,用的原理是:爬取整个html文件,然后根据标签页筛选有效信息。 现在看来这种方式无疑是吃力不讨好,因此现在重新写了一个爬取天气的程序。 准备工作 网上能轻松找到的是 101010100 北京这种编号,而查看中国气象局URL,他们使用的是北京545
前言 本文使用Python实现了PCA算法,并使用ORL人脸数据集进行了测试并输出特征脸,简单实现了人脸识别的功能。 1. 准备 ORL人脸数据集共包含40个不同人的400张图像,是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。此数据集包含40个类,每个类含10张图
前言 使用opencv对图像进行操作,要求:(1)定位银行票据的四条边,然后旋正。(2)根据版面分析,分割出小写金额区域。 图像校正 首先是对图像的校正 读取图片 对图片二值化 进行边缘检测 对边缘的进行霍夫曼变换 将变换结果从极坐标空间投影到笛卡尔坐标得到倾斜角 根据倾斜角对主体校正 import
天气预报API 功能 从中国天气网抓取数据返回1-7天的天气数据,包括: 日期 天气 温度 风力 风向 def get_weather(city): 入参: 城市名,type为字符串,如西安、北京,因为数据引用中国气象网,因此只支持中国城市 返回: 1、列表,包括1-7的天气数据,每一天的分别为一个
数据来源:House Prices - Advanced Regression Techniques 参考文献: Comprehensive data exploration with Python 1. 导入数据 import pandas as pd import warnings warnin
同步和异步 同步和异步是指程序的执行方式。在同步执行中,程序会按顺序一个接一个地执行任务,直到当前任务完成。而在异步执行中,程序会在等待当前任务完成的同时,执行其他任务。 同步执行意味着程序会阻塞,等待任务完成,而异步执行则意味着程序不会阻塞,可以同时执行多个任务。 同步和异步的选择取决于你的程序需
实现代码 import time import pydirectinput import keyboard if __name__ == '__main__': revolve = False while True: time.sleep(0.1) if keyboard.is_pr
本文从多个角度分析了vi编辑器保存退出命令。我们介绍了保存和退出vi编辑器的命令,以及如何撤销更改、移动光标、查找和替换文本等实用命令。希望这些技巧能帮助你更好地使用vi编辑器。
Python中的回车和换行是计算机中文本处理中的两个重要概念,它们在代码编写中扮演着非常重要的角色。本文从多个角度分析了Python中的回车和换行,包括回车和换行的概念、使用方法、使用场景和注意事项。通过本文的介绍,读者可以更好地理解和掌握Python中的回车和换行,从而编写出更加高效和规范的Python代码。
SQL Server启动不了错误1067是一种比较常见的故障,主要原因是数据库服务启动失败、权限不足和数据库文件损坏等。要解决这个问题,我们需要检查服务日志、重启服务器、检查文件权限和恢复数据库文件等。在日常的数据库运维工作中,我们应该时刻关注数据库的运行状况,及时发现并解决问题,以确保数据库的正常运行。
信息模块是一种可重复使用的、可编程的、可扩展的、可维护的、可测试的、可重构的软件组件。信息模块的端接需要从接口设计、数据格式、消息传递、函数调用等方面进行考虑。信息模块的端接需要满足高内聚、低耦合的原则,以保证系统的可扩展性和可维护性。
本文从电脑配置、PyCharm版本、Java版本、配置文件以及程序冲突等多个角度分析了Win10启动不了PyCharm的可能原因,并提供了解决方法。
本文主要从多个角度分析了安装SQL Server 2012时可能出现的错误,并提供了解决方法。
Pycharm是一款非常优秀的Python集成开发环境,它可以让Python开发者更加高效地进行代码编写、调试和测试。在Pycharm中设置解释器非常简单,我们可以通过创建新项目、修改项目解释器、设置全局解释器等多种方式进行设置。
Python中有多种方法可以将字符串转换为整数,包括使用int()函数、try-except语句、正则表达式、map()函数、ord()函数和reduce()函数。在实际应用中,应根据具体情况选择最合适的方法。
本文介绍了导入CSV文件的多种方法,包括使用Excel、Python和R等工具。同时,还介绍了导入CSV文件时需要注意的一些细节和问题。CSV文件是数据处理和分析中不可或缺的一部分,希望本文能够对读者有所帮助。
mongodb是一种新型的数据库,它采用了面向文档的数据模型,具有灵活性、高性能和高可用性等优势。但是,mongodb也存在数据结构混乱、安全性和学习成本高等问题。
当Python运行不了时,我们应该从代码、Python环境、操作系统和硬件设备等多个角度来排查问题,并采取相应的解决措施。