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中with语句的用法
Apr 15 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
详解python调度框架APScheduler使用
Mar 28 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
python3学习笔记之多进程分布式小例子
Feb 13 Python
Python3中关于cookie的创建与保存
Oct 21 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Python生成rsa密钥对操作示例
Apr 26 Python
Python学习笔记之Zip和Enumerate用法实例分析
Aug 14 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
python七种方法判断字符串是否包含子串
Aug 18 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
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
使用python实现个性化词云的方法
2017/06/16 Python
Python中常用信号signal类型实例
2018/01/25 Python
python3实现微型的web服务器
2019/09/03 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
学前教育毕业生自荐信范文
2013/12/24 职场文书
小学国庆节活动方案
2014/02/11 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
尊师重教演讲稿
2014/09/04 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
学术会议通知范文
2015/04/15 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
python实现简单倒计时功能
2021/04/21 Python
JavaScript控制台的更多功能
2021/04/28 Javascript
win7配置本地ftp服务器的图文教程
2022/08/05 Servers