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

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、