一.应用
爬取知乎回答,总结,做合集单:
好书推荐,高赞高关注回答的总结整理观点的整理
爬起京东,淘宝,拼多多,亚马逊评论,给出评论词云,差评好评比例等
(如何判别刷单?)
- 爬取豆瓣评论
- 淘宝联盟,京东,爬取高佣金,高时长商品,到咸鱼上架。
- 1688上10元以内,可提供以免费送。12元邮费。
闲鱼:水果生鲜,日用百货,女装服饰
品牌分析
某品牌的商品分析
售后
二.爬虫基础
0x01.爬虫介绍
1.定义
2.工作流程
3.爬虫的分类
根据爬取的内容,可分为以下4类。
3.1通用类,搜索引擎
3.2聚焦类,针对特定网站
3.3增量类,只爬取变化
3.4深层类,需要经过账号登陆,验证码验证
4.爬虫抓取策略
4.1深度优先策略
在网页a爬取,发现存在a1,a2两个链接。先爬a1,如果在a1内发现有b1,b2,b3三个链接,则先进入b1,爬取。如果b1内没有新链接,则退回a1,进入b2。以此类推。
每个枝节都深入爬取,直到爬完,然后返回上层,逐渐当顶。
适合嵌套深的网站。
4.2广度优先策略
逐层爬取。在网页a爬取,如果网页a有两个链接,则爬进去。之后对这两个链接分别爬取。不深入到网页里的子链接。
适合同层次url多,要求快速爬取的网站。
5.爬虫学习基础
5.1python语言
5.2数据库基础
5.3数据清洗和处理
6.爬虫法律和道德问题
6.1爬取注意事项
对特定网站,不能高频率并发,导致网站崩溃
爬取公共数据,如果商用,请专业法务对网站进行协议和声明进行分析确认后再用。
爬取非公开,需要用到个人账号。不允许公开数据。
6.2robots协议
0x02网页基础构成和抓取原理
1.网站的概念
1.1静态网站
所有页面使用html。无法与服务端互动。被动显示服务器端响应返回的信息。
优点:
容易被搜索引擎收录,方便seo优化;
内容独立,不依赖数据库。
缺点:
维护成本大,多数需要手工更新。
页面缺少互动,体验差。
1.2动态网站
提供与用户交互体验。如用户注册,实时推荐等。
包含静态html文件,还有服务端脚本,比如jsp,asp等。
优点:
用户体验好,实现个性化设置。
服务端与客户端互动,服务器对数据可管理和分析。
缺点:
客户端需要与数据库交互,降低访问速度;
对搜索引擎不友好。
2.网页三大基本元素
2.1html
超文本标记语言。约定文档的展现方式。
约定不同标签表示不同含义。
包含头部和主体两大部分。
负责页面结构。
2.2css
级联样式表或风格样式表。
配合html,提供丰富渲染效果。
负责页面样式。
2.3JavaScript
3.爬虫抓取原理
爬取的是html标签下特定数据,对数据进行持久化保存。
关键在于找到数据所处的html标签,因此需要分析网页的构成。
0x03html和css基础入门
1.html基础
常见标签
html:声明
head:头部
body:主体
title:标题
p:段落
button:按钮
h/h3:段落
bold:加粗
br:空行
img:图片,src带资源地址,alt提示不显示文字
a:超链接,href带链接
无序列表:ul下每项用li声明
有序列表:ol下每项用li声明
表格:table声明,thead表头,tbody表体;tr声明行,td是单元格。
表单:form声明,div块,label文本,input输入框,input有不同的形式,type声明,不同type对应不同额外属性
2.css基础
html里引入css样式:
选择器统一设置样式
可选择html标签.
<style type="text/css">
p {
background: grey; //增加灰色背景
color:white; //改变字体颜色为白色
font-size: 10pt; //设置字体大小为10pt
} //使用选择器选择p标签
</style>
0x04http协议通信基本原理
1.http的基本概念
Http(超文本传输协议) 是一种客户端-服务端模型,使用超媒体文档进行传输的,简单的,无状态的,无连接的,可扩展的应用层协议。
1.1客户端-服务端模型
客户端:发起请求。浏览器,爬虫程序。
服务端:响应请求,返回数据。计算机集群,软件或程序。
1.2超文本文档
1.3简单
1.4无状态
同一个连接中,不同请求间没有联系。这次的请求,无法知道上次请求的上下文信息。
想知道不同请求的上下文信息,可以通过会话。
比如用cookie来共享不同请求的上下文信息。
1.5无连接
每次连接,处理一次请求。
1.6可扩展
2.http简单工作流程
浏览器输入网址。
客户端发送请求:
http与传输层建立连接;http是应用层。
发送一个http请求报文。
服务端返回报文。
浏览器渲染返回信息,关闭连接,或者重用之前的连接。
0x05http的请求和相应(重点)
http请求包含四个部分:
请求行,请求头部,空行,请求数据。
请求数据可以是表单或json等格式。
1.请求行
GET / HTTP/1.1
请求方法
传输协议和版本
https比http多安全校验,用ssl/tls进行加密。
2.请求头
Host: www.imooc.com
Connection: keep-alive
Cache-Control: max-age=0
3.http响应
http响应包含:状态行,消息报头,空行,响应正文。
空行不可省略。
响应正文一般是一个html文档。
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=UTF-8
Content-Length: 49930
Connection: keep-alive
<HTML>....
状态行:包含协议及其版本,状态码,状态信息
常见状态码
2开头表示成功,3开头表示重定向,4开头是客户端错误,5开头是服务端错误。
消息报头
Server: nginx,表示服务端采用的服务器名称。
Content-Length: 49930,表示服务器返回的html内容的长度。
0x06python环境安装
命令行里,输入python,可看到安装python版本。
在官网直接下载。
0x07requests第三方库
1.requests安装
通过pip
pip install requests
2.requests请求
2.1get无参数请求
import requests
r = requests.get('https://www.imooc.com/')
print(r.text)
2.2get有参数请求
import requests
r = requests.get('https://www.imooc.com/', {marking: global_newcomer})
print(r.text)
2.3post无参数请求
import requests
r = requests.post('https://www.imooc.com/search/hotwords‘)
print(r.text)
返回json
2.4post有参数请求
import requests
r = requests.post('https://httpbin.org/post', data = {'key':'value'})
print(r.text)
返回json
requests其它请求类型
r = requests.put('https://httpbin.org/put', data = {'key':'value'})
r = requests.delete('https://httpbin.org/delete')
r = requests.head('https://httpbin.org/get')
r = requests.options('https://httpbin.org/get')
3.requests的响应
3.1获取二进制响应内容
import requests
r = requests.post('https://www.imooc.com/')
print(r.content)
返回
b'\n\r\n<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<meta charset="utf-8">\r\n<title>\xe6\x85\x95\xe8\xaf\xbe\xe7\xbd\x91-\xe7\xa8\x8b\xe5\xba\x8f\xe5\x91\x98\xe7\x9a\x84\xe6\xa2\xa6\xe5\xb7\xa5\xe5\x8e\x82</'
......
3.2获取响应状态码和响应编码
import requests
r = requests.post('https://www.imooc.com/')
print(r.status_code)
print(r.encoding)
根据响应码,来确定是否正确返回;可与之比较:requests.codes.ok
检查程序编码,防止乱码问题
4.自定义请求头
将请求头封装在字典。
url = 'https://www.imooc.com/'
headers = {'user-agent': 'app/1.0'}
r = requests.get(url, headers=headers)
print(r.request.headers) # 响应状态码
5.高级内容
设置请求时间,会话,代理,身份认证
官网学习
0x08最简单的爬虫案例开发
爬取哪个网站,就用哪个网站来命名。
import requests # requests库,用来发送网络请求
from bs4 import BeautifulSoup # 这是一个解析库,用来解析网页
url = "https://www.imooc.com" #慕课网首页地址
headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36'} # 请求头部
r = requests.get(url, headers= headers) # 发送请求
bs = BeautifulSoup(r.text, "html.parser") # 解析网页
mooc_classes = bs.find_all("h3", class_="course-card-name") # 定位课程信息
class_list = []
for i in range(len(mooc_classes)):
title = mooc_classes[i].text.strip()
class_list.append("课程名称 : {} \n".format(title)) #格式化课程信息
with open('mooc_classes.txt', "a+") as f: # 将课程信息写入文本文件中
for text in class_list:
f.write(text)
三.爬虫进阶
0x01使用xpath进行爬虫开发
Xpath( XML Path Language, XML路径语言),是一种在 XML 数据中,通过路径查找信息的查询语言。
也可以用来在html中查找需要的信息。
1.开发前准备
xpath_test.xml
<!--- 这是一个测试数据,方便我们后面进行解析-->
<div>
<ul>
<li class='item-0'><a href='a.html'>python item</a></li>
<li class='item-1'><a href='b.html'>java item</a></li>
<li class='item-inactive'><a href='c.html'><span class='bold'>C item</span></a></li>
<li class='item-1'><a href='d.html'>java item</a></li>
<li class='item-0'><a href='b.html'>java item</a></li>
<li class='item-0'><a href='b.html'>java item</a></li>
</ul>
</div>
2.基本语法
2.1节点之间的关系
- 父节点:每个元素都有一个父亲节点;
- 子节点:每个元素节点可以有零个,一个或者多个父亲节点;
- 兄弟节点:相同父亲节点的节点;
- 先辈节点:一个元素的父亲节点的父亲节点;
- 后辈节点:一个元素的子节点的子节点。
表达式基本语法
2.2谓语与通配符
3.开发案例
对以下文件进行操作:
<!--- 这是一个测试数据,方便我们后面进行解析-->
<div>
<ul>
<li class='item-0'><a href='a.html'>python item</a></li>
<li class='item-1'><a href='b.html'>java item</a></li>
<li class='item-inactive'><a href='c.html'><span class='bold'>C item</span></a></li>
<li class='item-1'><a href='d.html'>java item</a></li>
<li class='item-0'><a href='b.html'>java item</a></li>
<li class='item-0'><a href='b.html'>java item</a></li>
</ul>
</div>
从xml中查找出所有的’li’标签**
from lxml import etree
emt = etree.parse('text.xml')
rst = emt.xpath('//li')
从xml中查找出所有的’li’标签的所有class
from lxml import etree
emt = etree.parse('text.xml')
rst = emt.xpath('//li/@class')
从xml中查找出所有的’li’标签下面的href为a.html的标签
from lxml import etree
emt = etree.parse('text.xml')
rst = emt.xpath('//li/a[@href="a.html"]')
0x02使用BeautifulSoup4解析页面
1.BeautifulSoup4简介
对网页源码,结构化数据,便于对数据解析和提取。
不是python内置库,要额外安装,现在使用bs4。
2.安装BeautifulSoup4
pip install beautifulsoup4
3.BeautifulSoup4解析器
bs4有3种解析器:html.parse,html5lib,lxml。
bs4本身支持html.parse,html5lib,但lxml性能很强,容错能力强。
被广泛使用。
建议安装。
pip install lxml
3种解析器对比
除了lxml,其它两个都是python内置解析器。lxml需要额外安装。
只有lxml支持xml解析。
可根据是否内置,容错能力,是否解析xml,解析速度来比较。
综合考虑后,选择lxml。**
4.BeautifulSoup4四类对象
bs4将html转换成树形结构,每个节点都是python对象。
所有对象可归纳为4种:
4.1Tag(标签)
4.2NavigableString(可遍历字符串)
4.3BeautifulSoup(文档对象)
4.4Comment(注释对象)
NavigableString的特殊类型,是html里的注释内容
<!-- 慕课网 -->
5.BeautifulSoup4搜索文档树
以下列文件为例。文件名定位:bs4.html
<html>
<head>
<title>hello world</title>
</head>
<body>
<div>
<p class="p-one a-item" id="aaa">python introduction</p>
<p class="p-one">Basic Python Class</p>
</div>
<p class="p-two a-item" id="bbb"><b>Java introduction</b></p>
<p class="p-two"><b>Basic Java Class</b></p>
</body>
</html>
5.1字符串
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all('p')
打印出所有p节点下内容
<p class="p-one a-item" id="aaa">python introduction</p>
<p class="p-one">Basic Python Class</p>
<p class="p-two a-item" id="bbb"><b>Java introduction</b></p>
<p class="p-two"><b>Basic Java Class</b></p>
5.2正则表达式
找到所有含有“b”的标签,打印标签名。
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup (open("bs4.html"), features="lxml")
for tag in soup.find_all(re.compile("b")):
print(tag.name)
输出:
5.3列表
找到所有p,b标签
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all(["p", "b"])
5.4搜索属性
找到id为aaa的p标签
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all("p", id="aaa")
5.5搜索字符串内容
找到所有含“Java”字符串的文本
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all(string="Java")
5.6搜索css
5.6bs4其它方法
0x03使用正则表达式解析页面
1.正则表达式简介
对字符串的匹配规则
把网页源码转换成字符串,可用正则表达式,提取数据。
2.正则表达式基本语法
3.正则表达式常用方法
python内置模块re,是正则表达式模块。
导入即可使用。
下面是常用方法。
3.1re.findall
找到所有符合规则的匹配内容。
re.findall(pattern, string, flags=0)
import re # 导入正则
example = 'abc 33 bbb 3223 yehgst adsfe3 332' # 创建目标字符串
pattern = '\d+'
re.findall(pattern, example)
上面代码,找到所有字符串中的数字。
输出:
[‘33’,’3223’,’3’,’332’]