前面整理了一些爬虫的内容,今天写一个小小的栗子,内容不深,大佬请忽略。内容包括对豆瓣读书网站中的书籍的基本信息进行爬取,并整理,便于我们快速了解每本书的中心。

一、爬取信息

  每当爬取某个网页的信息时,首先就是要进入到网页中,看看有没有什么爬取过程中的限制,可以查看网站的robots协议。就是在原网址的后面加上"/robots.txt"。本网站中得到的结果是:

User-agent: *
Disallow: /subject_search
Disallow: /search
Disallow: /new_subject
Disallow: /service/iframe
Disallow: /j/
Sitemap: http://www.douban.com/sitemap_index.xml
Sitemap: http://www.douban.com/sitemap_updated_index.xml User-agent: Wandoujia Spider
Disallow: /

  根据上面的协议可以看到,并没有禁止一些普通的爬虫,就像我们现在这样,仅仅爬取一点点的东西来供自己使用。那么,我们就可以使用之前文章中提到的结构来实现这个爬虫,首先导入函数库,然后套用框架,传入地址,返回页面内容。这点内容在这篇博客中写到了,这里就不详细解释了。到此,网页的爬取就结束了,接下来就剩下从这些东西中拿到我们想要的内容。

 import requests

 url = "https://book.douban.com/"
def getHtmlText(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except:
print("Fail")
return html = getHtmlText(url)

二、信息处理

  上面提取的的网页代码包括很多东西,像展示出来的页面的各种框架等等,这些对我们来说都是没有用的,而且通过正则来提取信息,如果在整个页面中直接提取的话,不免会出现一些巧合,使得没有提取到真正想要的内容,而且pattern一样的其他内容,所以,首先,把要把关键的块先拿出来,再一点一点的取出具体信息。

 import re

 re_books = re.compile('<ul class="list-col list-col5 list-express slide-item">(.*?)</ul>', re.S)  # re.S也在正则表达式的博客中写到了,是为了让“.”可以匹配换行符
content = re_books.search(html)

  通过检查网页源代码,找到可以取出主要信息的匹配规则,将中间的内容全部获得。剩下的就是通过正则来提取每本书的每项信息。这个在于自己观察他们的规律,寻找匹配的规则。信息的标签不止一个,最后选择了使用pandas来整理数据,pandas的DataFrame数据类型可以很方便的存储二维结构,而且pandas有将数据之间存储成excel格式的方法(DataFrame.to_excel())。

 import pandas as pd  # 这是大部分人的习惯,pandas比较长,而且在数据处理中经常使用,所以用pd两个字母来代表

 # 首先,先创建一个DataFrame,之后遍历每本书籍的信息,存成DataFrame格式拼接在他的后面就可以了
data = pd.DataFrame(columns=['title', 'author', 'abstract', 'href', 'publisher']) re_book = re.compile('<li class="">(.*?)</li>', re.S)
bookList = re_book.findall(content[0]) # findall找到所有的书籍信息,返回为列表格式
for book in bookList:
count = 0
count += 1
href = re.search('href="(.*?)"', book) # .*? 是指以非贪婪的模式匹配,()是分组,通过group方便取出其中的信息
href = href.group(1)
title = re.search('<h4 class="title">(.*?)</h4>', book, re.S)
title = title.group(1).split()[0]
author = re.search('<span class="author">(.*?)</span>', book, re.S)
author = ' '.join(author.group(1).split())
publisher = re.search('<span class="publisher">(.*?)</span>', book, re.S)
publisher = ' '.join(publisher.group(1).split())
abstract = re.search('<p class="abstract">(.*?)</p>', book, re.S)
abstract = ' '.join(abstract.group(1).split())
abstract = re.sub('【内容简介】', '', abstract) # 慢慢调试中发现,取得的信息不太好看,其中在第一本数的主要内容开头有这么几个字,就用re的sub方法替换掉了
new = pd.DataFrame({"title":title, "author":author, "abstract":abstract, "href":href, "publisher":publisher}, index=[""])
data = data.append(new, ignore_index=True)
data.to_excel('bookInfo.xls', encoding='utf-8')

  我们可以看一下得到的结果,pandas直接输出的结果也很规整,这里存储到了excel中,起初存到csv文件中,但是乱码了,后面没多想就换成了excel,稍后我再去看看怎么回事,或者有读者清楚地,可以教教博主。

  图中有些东西没有展示出来,但是大家都懂对吧。可以自己试一试。当然这个爬虫很浅,仅得到这点的数据,后面的内容就交给你们了,可以试着往深里点一点,原理都是大同小异的,学习爬虫在平时就要随时发现可以挖掘的东西,慢慢尝试。

豆瓣读书爬虫(requests + re)的更多相关文章

  1. PHP抓取豆瓣读书爬虫代码

    <?php//演示地址 http://asizu.sinaapp.com/reptile_douban.php//数据量不是特别大,没有写抓完数据便停止. 喜欢的朋友拿去自己改改就好了 head ...

  2. 【Python爬虫】听说你又闹书荒了?豆瓣读书9.0分书籍陪你过五一

    说明 五一将至,又到了学习的季节.目前流行的各大书单主打的都是豆瓣8.0评分书籍,却很少有人来聊聊这9.0评分的书籍长什么样子.刚好最近学了学python爬虫,那就拿豆瓣读书来练练手. 爬虫 本来思路 ...

  3. urllib2模块初体验———豆瓣读书页面下载小爬虫

    我也是根据:http://blog.csdn.net/pleasecallmewhy/article/details/8927832 ,来写出豆瓣读书的爬虫,废话不说直接上代码: #!/usr/bin ...

  4. python爬虫:利用正则表达式爬取豆瓣读书首页的book

    1.问题描述: 爬取豆瓣读书首页的图书的名称.链接.作者.出版日期,并将爬取的数据存储到Excel表格Douban_I.xlsx中 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目 ...

  5. 爬虫——requests模块

    一 爬虫简介 #1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. #2.互联网建立的目的? 互联网的核心价值在于数据的共享/传递:数据是 ...

  6. Python爬虫—requests库get和post方法使用

    目录 Python爬虫-requests库get和post方法使用 1. 安装requests库 2.requests.get()方法使用 3.requests.post()方法使用-构造formda ...

  7. 豆瓣读书top250数据爬取与可视化

    爬虫–scrapy 题目:根据豆瓣读书top250,根据出版社对书籍数量分类,绘制饼图 搭建环境 import scrapy import numpy as np import pandas as p ...

  8. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  9. Java豆瓣电影爬虫——抓取电影详情和电影短评数据

    一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. ...

随机推荐

  1. 网站的增 / 删 / 改 / 查 时常用的 sql 语句

    最近在学习数据库 php + mysql 的基本的 crud 的操作,记录碰到的坑供自己参考.crud中需要用到的sql语句还是比较多的,共包括以下几个内容: 查询所有数据 查询表中某个字段 查询并根 ...

  2. L2-024. 部落

    在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈.我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同 ...

  3. 计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误

    计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误: 书上本来要写的是以x为阶越步长的方法,但是他写的是用一部分y为阶越步长的方法(其实也写的不对),最后以x为阶越步长的 ...

  4. zabbix监控tomcat(使用jmx监控,但不使用系统自带模版)

    一,zabbx使用jmx监控tomcat的原理分析 1.Zabbix-Server找Zabbix-Java-Gateway获取Java数据 2.Zabbix-Java-Gateway找Java程序(j ...

  5. Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)

    当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷分区 ...

  6. RHEL下SendMail修改发邮箱地址

    RHEL(Oracle Linxu/CentOS)系统下,如果使用sendmail发送邮件,如果不特殊设置,一般发件箱地址为user@hostname,例如,hostname为DB-Server.lo ...

  7. C#-hello world(二)

     1.C# 程序构成 命名空间(Namespace) 一个 class Class 方法 Class 属性 一个 Main 方法 语句(Statements)和 表达式(Expressions) 注释 ...

  8. Redis高可用 Sentinel

    官网: https://redis.io/topics/sentinel Redis的主从只能实现数据热备份的功能,主宕机后从无法自动接管服务,因此Redis推出了Sentinel的主从监控模式. S ...

  9. jenkins 备份配置信息

    本文介绍几种备份jenkin配置信息的方法,大家可根据实际情况做出选择. 我的测试环境如下: windows 7 jenkins 2.32.3 ____升级到___2.46.3 (长期支持版本) 多种 ...

  10. 2016某知名互联网公司PHP面试题及答案(续)

    1 写出mysql中,插入数据,读出数据,更新数据的语句 INSERT INTO 表名 VALUES ("",""): SELECT * FROM 表名:. U ...