爬虫练手小实例---【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

相关文章

swiper实例

大家好,我是燐子,今天给大家带来swiper实例   微信小程序中的 swiper 组件是一种用于创建滑动视图的容器组件,常用于实现图片轮播、广告展示等效果。它通过一系列的子组件 swiper-item 来定义滑动视图的每一个页面。 基本用法   以下是一个简单的 swiper 示例代码:   WXML(页面结构) <swiper autoplay="true" interval="3

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

Python爬虫-贝壳新房

前言 本文是该专栏的第32篇,后面会持续分享python爬虫干货知识,记得关注。 本文以某房网为例,如下图所示,采集对应城市的新房房源数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly93aC5mYW5nLmtlLmNvbS9sb3VwYW4v 目标:采集对应城市的

如何实现一台机器上运行多个MySQL实例?

在一台机器上一个MySQL服务器运行多个MySQL实例有什么好处?这里我先入为主给大家介绍这样做至少存在两个好处(看完这篇文章后理解会更透彻): (1)减轻服务器链接负担 (2)为不同的用户提供不同的mysqld服务器的访问权限以方便这些用户进行自我管理。   下面我介绍具体的实现过程: 一、准备工作     台式机一台、Windows系统、MySQL服务器(我安装的版本是MySQL

Docker Compose--安装Nginx--方法/实例

原文网址:Docker Compose--安装Nginx--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker Compose如何安装Nginx。 目录结构 ├── config│   ├── cert│   │   ├── xxx_bundle.pem│   │   └── xxx.key│   ├── conf.d│   └── nginx.co

爬虫阶段思考

内容:写这篇文章是因为最近帮同学改了很多的爬虫代码,感触良多。 我用豆瓣为例,并不是不会用别的,而是这个我个人感觉最经典。然后还会写我遇到的一些问题以及解决方法。 首先,我们得先知道怎样爬取。我用的scrapy框架爬取。 我对此图的理解就是: 从spiders中获得一个请求(REQUEST),通过引擎传递给调度器,之后再返回给引擎,引擎把url封装好后传递给下载器,下载器将资源下载好后

libssh-cve_2018_10933-vulfocus

1.原理 ibssh是一个用于访问SSH服务的C语言开发包,它能够执行远程命令、文件传输,同时为远程的程序提供安全的传输通道。server-side state machine是其中的一个服务器端状态机。   在libssh的服务器端状态机中发现了一个逻辑漏洞。攻击者可以MSG_USERAUTH_SUCCESS在身份验证成功之前发送消息。这样可以绕过身份验证并访问目标SSH服务器。 本来是靶机要

用 idea 启动多个实例

在学习负载均衡的时候,要模拟多个实例均提供一个服务,我们要如何用 idea 启动多个实例呢?         如下图,我们已经启动了一个 ProductService 服务,现在想再启动两个相同的服务 1. 选中要启动的服务,右键选择 Copy Configuration... 2 在弹出的框中,选择 Modify options -> Add VM option

简单工厂模式--结合实例学习简单工厂模式

在讲解简单工厂模式之前,有必要先了解一下OO的一些原则  1.OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。也就是说,对于一个已有的软件,如果需要扩展,应当在不需修改      已有代码的基础上进行。   2.DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。简单点说

Struts2(一)---struts2的环境搭建及实例

刚刚接触struts2,有点懵懵懂懂,还是习惯于先写代码,然后慢慢来理解其中的思想。 这篇文章主要内容是strusts的环境搭建及通过一个简单的例子来理解到底是怎么使用struts来简化编程的。 1.项目结构如下如,包括必须的包 2.web.xml <?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="