Python 50行爬虫抓取并处理图灵书目过程详解


Posted in Python onSeptember 20, 2019

前言

使用 requests进行爬取、BeautifulSoup进行数据提取。

主要分成两步: 第一步是解析图书列表页,并解析出里面的图书详情页链接。 第二步是解析图书详情页,提取出感兴趣的内容,本例中根据不同的数据情况,采用了不同的提取方法,总的感觉就是BeautifulSoup用起来很方便

以下是几个典型HTML内容提取的Python代码片段

1、提取详情页链接

列表页中的详情页链接片段

<h4 class="name">
 <a href="/book/1921" rel="external nofollow" title="深度学习入门:基于Python的理论与实现">
  深度学习入门:基于Python的理论与实现
 </a>
</h4>

提取详情页链接的Python代码

# bs是BeautifulSoup的instance
bs.select('.name')
for 详情链接信息 in bs.select('.name'):
 # 提取出链接
 print(详情链接信息.a.get('href'))

2、提取详情页中的图书名称

详情页中图书名称HTML代码

<h2>
   深度学习入门:基于Python的理论与实现
</h2>

提取图书名称的Python代码

# 因为提取出来的文字前后还带了很多空格,所以要用strip去掉 
bs.h2.get_text().strip()

3、提取电子书价格信息

详情页中电子书价格HTML代码

<dt>电子书</dt>
 <dd>
   <span class="price">¥29.99</span>
 </dd>

提取电子书价格的Python代码

# 因为不是每本书都有电子书,所以要判断一下
有电子书 = bs.find("dt", text="电子书")
if 有电子书:
 价格=有电子书.next_sibling.next_sibling.find("span", {"class": "price"}).get_text().strip()[1:]
 print(float(价格))

完整代码

# ituring.py,python3版本,默认只抓两页,可以通过启动参数控制要抓的列表页范围
import sys
import requests
import time
from bs4 import BeautifulSoup

def 输出图书列表中的详情链接(bs):
 # 找到页面中所有的 <h4 class="name"><a href="/book/..." rel="external nofollow" >...</a></h4>
 for 详情链接信息 in bs.select('.name'):
  # 提取出链接
  yield 详情链接信息.a.get('href')

def 获取图书详情(链接):
 详情页 = requests.get('http://www.ituring.com.cn%s' %链接)
 if 详情页.ok:
  bs = BeautifulSoup(详情页.content, features="html.parser")

  图书 = {}

  图书['title'] = bs.h2.get_text().strip()
  图书['status'] = bs.find("strong", text="出版状态").next_sibling

  有定价 = bs.find("strong", text="定价")
  if 有定价:
   图书['price'] = 有定价.next_sibling

   有电子书 = bs.find("dt", text="电子书")
   if 有电子书:
    图书['ePrice'] = float(有电子书.next_sibling.next_sibling.find("span", {"class": "price"}).get_text().strip()[1:])

  有出版日期 = bs.find("strong", text="出版日期")
  if 有出版日期:
   图书['date'] = 有出版日期.next_sibling

  图书['tags'] = []
  for tag in bs.select('.post-tag'):
   图书['tags'].append(tag.string)

  return 图书

 else:
  print('❌ 详情页 http://www.ituring.com.cn%s' %链接)

def 解析图书列表页(起始页, 终止页):
 for 页序号 in range(起始页 - 1, 终止页): 
  # 逐一访问图书列表页面
  列表页 = requests.get('http://www.ituring.com.cn/book?tab=book&sort=new&page=%s' %页序号)

  if 列表页.ok:
   # 创建 BeautifulSoup 的 instance
   bs = BeautifulSoup(列表页.content, features="html.parser")

   # 提取 列表页中的 详情页链接,并逐一分析
   for 详情页面链接 in 输出图书列表中的详情链接(bs):
    图书信息 = 获取图书详情(详情页面链接)
    # 得到的图书信息,按照自己的需求去处理吧
    print(图书信息)
    # 抓完一本书休息一下
    time.sleep(0.1)

   print('✅ 第%s页获取完毕\n\t' %(页序号 + 1))
  else:
   print('❌ 第%s页获取出错\n\t' %(页序号 + 1))

if __name__ == '__main__':
 # 默认图书列表起始页 和 终止页
 起始图书列表页码 = 1
 终止图书列表页码 = 2 # ⚠️ 改改代码页可以实现自动获得最后一页 

 # 获取输入参数; ⚠️此处未对输入参数的类型做检测
 if(len(sys.argv)==2):
  # 只有一个参数时,输入的是终止页码,起始页码默认为 0
  终止图书列表页码 = int(sys.argv[1])
 if(len(sys.argv)==3):
  # 有两个参数时, 第一个参数是起始页码,第二个参数是终止页码
  起始图书列表页码 = int(sys.argv[1])
  终止图书列表页码 = int(sys.argv[2])

 解析图书列表页(起始图书列表页码, 终止图书列表页码)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中根据字符串调用函数的实现方法
Jun 12 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
python读取文件名称生成list的方法
Apr 27 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
Python中捕获键盘的方式详解
Mar 28 Python
解决python 上传图片限制格式问题
Oct 30 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
python实现超级玛丽游戏
Mar 18 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
使用python获取邮箱邮件的设置方法
Sep 20 #Python
Python中的上下文管理器相关知识详解
Sep 19 #Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 #Python
pandas read_excel()和to_excel()函数解析
Sep 19 #Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 #Python
vscode 配置 python3开发环境的方法
Sep 19 #Python
python实现简易学生信息管理系统
Apr 05 #Python
You might like
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
浅谈PHP的反射API
2017/02/26 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
jquery实用代码片段集合
2010/08/12 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
python实现查询IP地址所在地
2015/03/29 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
2020/08/05 Python
python opencv肤色检测的实现示例
2020/12/21 Python
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
员工拾金不昧表扬信
2014/01/09 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python