本教程的知识点为:爬虫概要 爬虫基础 爬虫概述 知识点: 1. 爬虫的概念 requests模块 requests模块 知识点: 1. requests模块介绍 1.1 requests模块的作用: 数据提取概要 数据提取概述 知识点 1. 响应内容的分类 知识点:了解 响应内容的分类 Selenium概要 selenium的介绍 知识点: 1. selenium运行效果展示 1.1 chrome浏览器的运行效果 Selenium概要 selenium的其它使用方法 知识点: 1. selenium标签页的切换 知识点:掌握 selenium控制标签页的切换 反爬与反反爬 常见的反爬手段和解决思路 学习目标 1 服务器反爬的原因 2 服务器常反什么样的爬虫 反爬与反反爬 验证码处理 学习目标 1.图片验证码 2.图片识别引擎 反爬与反反爬 JS的解析 学习目标: 1 确定js的位置 1.1 观察按钮的绑定js事件 Mongodb数据库 介绍 内容 mongodb文档 mongodb的简单使用 Mongodb数据库 介绍 内容 mongodb文档 mongodb的聚合操作 Mongodb数据库 介绍 内容 mongodb文档 mongodb和python交互 scrapy爬虫框架 介绍 内容 scrapy官方文档 scrapy的入门使用 scrapy爬虫框架 介绍 内容 scrapy官方文档 scrapy管道的使用 scrapy爬虫框架 介绍 内容 scrapy官方文档 scrapy中间件的使用 scrapy爬虫框架 介绍 内容 scrapy官方文档 scrapy_redis原理分析并实现断点续爬以及分布式爬虫 scrapy爬虫框架 介绍 内容 scrapy官方文档 scrapy的日志信息与配置 利用appium抓取app中的信息 介绍 内容 appium环境安装 学习目标
移步这里全套资料代码:
博客文章1: https://blog.51cto.com/u_16958431/11767188
博客文章2: https://blog.51cto.com/u_16958431/11753821
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
部分文件图片:
数据提取概要
本阶段主要学习获取响应之后如何从响应中提取我们想要的数据,在本阶段中我们会讲解一些常用的方法和模块,基本上我们以后遇到的情况在掌握本阶段之后都能搞定
数据提取概述
知识点
- 了解 响应内容的分类
- 了解 xml和html的区别
1. 响应内容的分类
在发送请求获取响应之后,可能存在多种不同类型的响应内容;而且很多时候,我们只需要响应内容中的一部分数据
-
结构化的响应内容
-
json字符串
- 可以使用re、json等模块来提取特定数据
- json字符串的例子如下图
-
xml字符串
-
可以使用re、lxml等模块来提取特定数据
-
xml字符串的例子如下
-
-
<bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore> ```
-
非结构化的响应内容
-
html字符串
- 可以使用re、lxml等模块来提取特定数据
- html字符串的例子如下图
-
知识点:了解 响应内容的分类
2. 认识xml以及和html的区别
xml是一种可扩展标记语言,样子和html很像,功能更专注于对传输和存储数据
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
上面的xml内容可以表示为下面的树结构:
2.2 xml和html的区别
如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的。jsonpath模块就能解决这个痛点,接下来我们就来学习jsonpath模块
jsonpath可以按照key对python字典进行批量数据提取
知识点:了解 jsonpath模块的使用场景
2. jsonpath模块的使用方法
2.1 jsonpath模块的安装
我们以拉勾网城市JSON文件 [ 为例,获取所有城市的名字的列表,并写入文件。
参考代码:
import requests
import jsonpath
import json
# 获取拉勾网城市json字符串
url = '
headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"}
response =requests.get(url, headers=headers)
html_str = response.content.decode()
# 把json格式字符串转换成python对象
jsonobj = json.loads(html_str)
# 从根节点开始,获取所有key为name的值
citylist = jsonpath.jsonpath(jsonobj,'$..name')
# 写入文件
with open('city_name.txt','w') as f:
content = json.dumps(citylist, ensure_ascii=False)
f.write(content)
知识点:掌握 jsonpath模块的使用
数据提取概要
本阶段主要学习获取响应之后如何从响应中提取我们想要的数据,在本阶段中我们会讲解一些常用的方法和模块,基本上我们以后遇到的情况在掌握本阶段之后都能搞定
数据提取-lxml模块
知识点
- 了解 lxml模块和xpath语法的关系
- 了解 lxml模块的使用场景
- 了解 lxml模块的安装
- 了解 谷歌浏览器xpath helper插件的安装和使用
- 掌握 xpath语法-基础节点选择语法
- 掌握 xpath语法-节点修饰语法
- 掌握 xpath语法-其他常用语法
- 掌握 lxml模块中使用xpath语法定位元素提取属性值或文本内容
- 掌握 lxml模块中etree.tostring函数的使用
1. 了解 lxml模块和xpath语法
要想利用lxml模块提取数据,需要我们掌握xpath语法规则。接下来我们就来了解一下xpath helper插件,它可以帮助我们练习xpath语法
2.1 谷歌浏览器xpath helper插件的作用
我们以windos为例进行xpath helper的安装
2.2.1 xpath helper插件的安装
-
下载Chrome插件 XPath Helper
-
可以在chrome应用商城进行下载,如果无法下载,也可以从下面的链接进行下载
-
下载地址:[ 密码:337b
-
-
把文件的后缀名crx改为rar,然后解压到同名文件夹中
-
把解压后的文件夹拖入到已经开启开发者模式的chrome浏览器扩展程序界面
- 重启浏览器后,访问url之后在页面中点击xpath图标,就可以使用了
- 如果是linux或macOS操作系统,无需操作上述的步骤2,直接将crx文件拖入已经开启开发者模式的chrome浏览器扩展程序界面
知识点:了解 谷歌浏览器xpath helper插件的安装和使用
3. xpath的节点关系
每个html、xml的标签我们都称之为节点,其中最顶层的节点称为根节点。我们以xml为例,html也是一样的
3.2 xpath中节点的关系
author
是title
的第一个兄弟节点
4. xpath语法-基础节点选择语法
接下来我们通过itcast的页面来练习上述语法:[
-
选择所有的h2下的文本
//h2/text()
-
获取所有的a标签的href
//a/@href
-
获取html下的head下的title的文本
/html/head/title/text()
-
获取html下的head下的link标签的href
/html/head/link/@href
知识点:掌握 xpath语法-选取节点以及提取属性或文本内容的语法
5. xpath语法-节点修饰语法
从itcast的页面中,选择所有学科的名称、第一个学科的链接、最后一个学科的链接:[
-
所有的学科的名称
//div[@class="nav_txt"]//a[@class="a_gd"]
-
第一个学科的链接
//div[@class="nav_txt"]/ul/li[1]/a/@href
-
最后一个学科的链接
//div[@class="nav_txt"]/ul/li[last()]/a/@href
知识点:掌握 xpath语法-选取特定节点的语法
6. xpath语法-其他常用节点选择语法
从itcast的页面中 [ ,选中全部的标签、全部的属性
-
全部的标签
//*
-
全部的属性
//node()
知识点:掌握 xpath语法-选取位置节点的语法
7. lxml模块的安装与使用示例
运行下面的代码,查看打印的结果
from lxml import etree
text = '''
<div>
<ul>
<li class="item-1">
<a rel="nofollow" href="link1.html">first item</a>
</li>
<li class="item-1">
<a rel="nofollow" href="link2.html">second item</a>
</li>
<li class="item-inactive">
<a rel="nofollow" href="link3.html">third item</a>
</li>
<li class="item-1">
<a rel="nofollow" href="link4.html">fourth item</a>
</li>
<li class="item-0">
a href="link5.html">fifth item</a>
</ul>
</div>
'''
html = etree.HTML(text)
#获取href的列表和title的列表
href_list = html.xpath("//li[@class='item-1']/a/@href")
title_list = html.xpath("//li[@class='item-1']/a/text()")
#组装成字典
for href in href_list:
item = {}
item["href"] = href
item["title"] = title_list[href_list.index(href)]
print(item)
8 练习
运行下边的代码,观察对比html的原字符串和打印输出的结果
from lxml import etree
html_str = ''' <div> <ul>
<li class="item-1"><a rel="nofollow" href="link1.html">first item</a></li>
<li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
<li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
<li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
<li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a>
</ul> </div> '''
html = etree.HTML(html_str)
handeled_html_str = etree.tostring(html).decode()
print(handeled_html_str)
10.1 现象和结论
打印结果和原来相比:
- 自动补全原本缺失的
li
标签- 自动补全
html
等标签<html><body><div> <ul> <li class="item-1"><a rel="nofollow" href="link1.html">first item</a></li> <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li> <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li> <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li> <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a> </li></ul> </div> </body></html>
结论:
lxml.etree.HTML(html_str)可以自动补全标签
lxml.etree.tostring
函数可以将转换为Element对象再转换回html字符串爬虫如果使用lxml来提取数据,应该以
lxml.etree.tostring
的返回结果作为提取数据的依据知识点:掌握 lxml模块中etree.tostring函数的使用
Selenium概要
本阶段主要学习selenium自动化测试框架在爬虫中的应用,selenium能够大幅降低爬虫的编写难度,但是也同样会大幅降低爬虫的爬取速度。在逼不得已的情况下我们可以使用selenium进行爬虫的编写。