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的Flask框架中构建Web表单的教程
Jun 04 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
python模块导入的细节详解
Dec 10 Python
实例介绍Python中整型
Feb 11 Python
对Python3 序列解包详解
Feb 16 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
python实现人机猜拳小游戏
Feb 03 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
PYcharm 激活方法(推荐)
Mar 23 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
Python中22个万用公式的小结
Jul 21 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
用Flash图形化数据(一)
2006/10/09 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
python实现用户登陆邮件通知的方法
2015/07/09 Python
对Python中画图时候的线类型详解
2019/07/07 Python
python的json包位置及用法总结
2020/06/21 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
虚拟机下载python是否需要联网
2020/07/27 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
手机业务员岗位职责
2013/12/13 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
六查六看心得体会
2014/10/14 职场文书
优秀团员个人总结
2015/02/26 职场文书
2015年教学工作总结
2015/04/02 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
mysql幻读详解实例以及解决办法
2022/06/16 MySQL