爬虫练手小实例---【2018年 豆瓣书评9.0以上书籍】

2024-02-24 06:20

本文主要是介绍爬虫练手小实例---【2018年 豆瓣书评9.0以上书籍】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

最近一直在忙于工作的java,还记得上个月机器学习中立下的flag,要利用业余时间先学习数据的爬取,清理等操作。。而最近晚上处于想让心静下来,每天都坚持看半个小时的书。。。这样才有了今天的这个想法,爬取了一下20182018年 豆瓣书评9.0以上书籍,再次做个记录。

环境

  • python3
  • BeautifulSoup
  • requests
  • lxml
  • json
  • multiprocessing

分析网页源码

url链接如下:
https://www.douban.com/doulist/1264675/

这里写图片描述
爬取的目标:
获取书单的序列号,名字,作家,出版时间,评分数
F12查看源代码对应想要的信息,来分析一下:
序号:
这里写图片描述
书名:
这里写图片描述
评分:
这里写图片描述
作者、出版社、时间:
这里写图片描述

源码

经过分析处理后,事情就变得简单多了。。。requests+beautiful无解!!

源码如下,老样子,不多做解释了,每行都有对应注释,写的很详细:

# coding = utf-8"""
@author: sy@file: SpiderBooks.py@time: 2018/5/11 22:59@desc: 爬取豆瓣读书评分9分以上榜单"""
import requests
from requests import RequestException
import json
from bs4 import BeautifulSoup as bs
from multiprocessing import Pool# 获取一页的html源码
def get_one_page(url):try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}response = requests.get(url=url, headers=headers)# 如果状态码等于200返回html源码if response.status_code == 200:return response.textreturn Noneexcept RequestException:return None# 解析源码,拿到想要的内容
def parse_one_page(html):soup = bs(html, 'lxml')'''分析下面代码:获取书单的序列号,名字,作家,出版时间,评分数<div id="item253261897" class="doulist-item"> ...<span class="pos">1</span> <div class="post"> <a href="https://book.douban.com/subject/10519369/" target="_blank"> <img width="100" src="https://img1.doubanio.com/view/subject/l/public/s8869768.jpg" /> </a> </div> <div class="title"> <a href="https://book.douban.com/subject/10519369/" target="_blank"> 万物生光辉 </a> </div> <div class="abstract">作者: [英] 吉米&middot;哈利 <br /> 出版社: 中国城市出版社 <br /> 出版年: 2012-3 </div>..</div>'''doulist = soup.find_all(name='div', attrs={'class': 'doulist-item'})for book in doulist:try:#.strip().replace(' ', '').replace("\n\n", "、"):去除空格,将空格缩进,再将\n\n替换掉# 书的序号seq = book.find(name='span', attrs={'class': 'pos'}).get_text().strip().replace(' ', '').replace("\n\n", "、")# print(seq)# 图片urljpg_url = book.find(name='img').get('src')# print(jpg_url)# 书名book_name = book.find(name='div', attrs={'class': 'title'}).get_text().strip().replace(' ', '').replace("\n\n", "、")# print(book_name)# 书作者、出版社、时间book_author = book.find(name='div', attrs={'class': 'abstract'}).get_text().strip().replace(' ', '').replace("\n\n", "、")# print(book_author)# 书评book_star = book.find(name='blockquote', attrs={'class': 'comment'}).get_text().strip().replace(' ', '').replace("\n\n", "、")# print(book_star)yield {"seq": seq,"jpg_url": jpg_url,"book_name": book_name,"book_author": book_author,"book_star": book_star}except Exception:print('出现异常!')continue# 写入文件中
def write_to_file(content):#如果不加ensure_ascii=False,中文会变成ascii的编码格式with open('books.txt', 'a', encoding='utf-8') as f:f.write(json.dumps(content, ensure_ascii=False) + '\n')f.close()def main(offset):# 注释下面的主页,因为分析出第一页也可以写成0的形式# url = 'https://www.douban.com/doulist/1264675/''''第2页:https://www.douban.com/doulist/1264675/?start=25&sort=seq&sub_type=第3页:https://www.douban.com/doulist/1264675/?start=50&sort=seq&sub_type=可以推断如下的第1页:https://www.douban.com/doulist/1264675/?start=0&sort=seq&sub_type='''url = 'https://www.douban.com/doulist/1264675/?start=' + str(offset) + '&sort=seq&sub_type='html = get_one_page(url)#返回的是一个字典book_dict = parse_one_page(html)for content in book_dict:print(content)write_to_file(content)if __name__ == '__main__':# 创建进程池,加快爬取速度pool = Pool()#进程池的映射方法,第一个参数传入函数,第二个传入参数,用生成器生成了一个步长为25,循环20次列表pool.map(main, [i * 25 for i in range(20)])pool.close()  # 关闭进程池,不再接受新的进程pool.join()  # 主进程阻塞等待子进程的退出

过程思路

分析对应的html标签元素,用soup(这锅美味的汤)解析要的元素内容,每次把解析的内容用yield关键词返回dict写入txt文档中,最终开启进程池去执行函数。

成果展示

这里写图片描述

总结

学到的东西:python的进程池之前没有接触过,这次试了一下,效率很高,基本上2s爬完20页的所有信息。。。
其中用yield关键字作为了返回dict类型的内容,再有就是对beautifulsoup库的使用更加深了一步理解。

这篇关于爬虫练手小实例---【2018年 豆瓣书评9.0以上书籍】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

PyQt6 键盘事件处理的实现及实例代码

《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录一、键盘事件处理详解1、核心事件处理器2、事件对象 QKeyEvent3、修饰键处理(1)、修饰键类

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态