赞
踩
爬虫
Beatuiful Soup:网页解析器
from bs4 import BeatuifulSoup
html_doc:HTML文档字符串
html.parser:HTML解析器
from_encoding='utf8':文档的编码
find all/find:搜索节点
find_all(name,attrs,string)
soup.find_all('a'):查找所有标签为a的节点
soup.find_all('a',href='/view/123.html'):查找所有标签为a,链接符合/view/123.html形式的节点
soup.find_all('div',class_='abc',string='python'):查找所有标签为div,class为abc,文字为python的节点
访问节点信息
node.name:获取查找到的节点标签名称
node['href']:获取查找到的a节点的href属性
node.get_text():获取查找到的a节点的链接文字
使用场景
通用爬虫
抓取系统重要组成部分,抓取的是一整张页面数据
聚焦爬虫
是建立在通用爬虫的基础之上,抓取的是页面中特定的局部内容
编码流程
1.指定url
2.发起请求
3.获取响应数据
4.数据解析
5.持久化存储
增量式爬虫
检测网站中数据更新的情况,只会抓取网站中最新更新出来的数据
爬虫的矛和盾
反爬机制
门户网站,可以通过指定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取
robots.txt协议
规定了网站中哪些数据可以被爬取,哪些不可以爬取
反反爬策略
爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而获取到想要的信息
验证码
识别验证码图中数据用于模拟登陆操作
识别验证码的操作
人工肉眼识别(不推荐)
第三方平台模拟识别
使用打码平台识别验证码的编码流程
1.将验证码图片进行本地下载
2.调用平台提供的实例代码进行图片数据识别
检查网络请求
标头 header
请求URL:爬虫要爬取的网页链接
请求方法:post,get
Content-Type:查看请求的类型
text/html/plain(纯文本)/xml/gif/jjpeg/png
application/json(数据格式)/pdf/word
User-Agent:访问用户
负载payload
表单数据
响应
要爬取的
http和https协议
http协议
服务器和客户端进行数据交互的一种形式
https协议
安全的超文本传输协议(涉及数据加密)
常用请求头信息
User-Agent:请求载体的身份标识
Connection:请求完毕后,是断开连接还是保持连接
常用响应头信息
Content-Type:服务器响应回客户端的数据类型
加密方式
对称密钥加密
非对称密钥加密
证书密钥加密
无状态
没有请求到对应页面数据的原因
发起的第二次基于个人主页页面请求的时候,服务器端并不知道该次请求是基于登陆状态下的请求
requests 库
python中原生的一款基于网络请求的模块,作用是模拟浏览器发送请求
requests.get/post()
url:要下载的目标网页的URL
params:字典形式,设置URL后面的参数
data:字典或者字符串,一般用于post方法时提交数据
headers:设置user-agent,refer等请求头
timeout:超时时间,单位是秒
verify:True/False,是否进行HTTPS证书验证,默认是,需要自己设置证书地址
allow_redirects:True/False是否让requets做重定向处理,默认是
cookies:附带本地的cookies数据
接收response响应
r = requests.get/post(url)
r.status_code:查看状态码,如果等于200则请求成功
r.encoding:可以查看当前编码,以及变更编码
r.text:查看返回的网页内容
r.headers:查看返回的HTTP的headers
r.url:查看实际访问的URL
r.content:以字节的方式返回内容,比如用于下载图片
r.cookies:服务端要写入本地的cookies数据
requests模块的编码流程
1.指定url
UA检测/UA伪装
2.发起请求
3.获取响应数据
4.持久化存储
数据解析
数据解析原理概述
解析局部的文本内容进行存储
1.进行指定标签的定位
2.标签或者标签对应的属性中存储的数据值进行提取(解析)
数据解析的分类
正则表达式
bs4
python中独有
bs4数据解析原理
1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
1.将本地的html文档中的数据加载到该对象中
2.将互联网上获取的页面源码加载到该对象中
2.通过调用BeatifulSoup对象中相关的属性或者方法进行标签定位和数据提取
方法和属性
soup.tagName: 返回html中第一次出现的tagName标签
soup.find(‘tagName’):和soup tagName一样
soup.find('div',class_/id/attr='')#可以根据属性定位
soup.find_all('tagName'):返回符合要求的所有标签(以列表的形式)
soup.select('某种选择器(id,class,标签...选择器)') (返回的是一个列表)
soup.select('.标签 > ul >li >a')
>:表示的是一个层级
空格表示多个层级
soup.a.text/string/get_text()
text/get_text():可以获取某一个标签中所有的文本内容
string:只可以获取该标签下面直系的文本内容
属性值 :soup.a['属性']
xpath
最常用且最便捷高效的一种解析方式,通用性很高
xpath解析原理
1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
1.将本地的html文档中的源码数据加载到etree对象中(etree.parse(filePath))
2.可以将从互联网上获取到的源码数据加载到该对象中(etree.HTML('page_text'))
2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
xpath表达式
/:表示从根节点开始定位,表示一个层级
//:表示多个层级 相当于bs4中的空格
属性定位://tag[@attrName="attrValue"]
索引定位:索引是从1开始的,在定位后加偏移量[x]
取文本:/text():取直系的文本 //text()取非直系的文本
取属性:@attrName
os相关
创建一个文件夹
if not os.path.exists('./picLibs'):
os.mkdir('./picLibs')
with open(r'filename.txt') as f:
data_user=pd.read_csv(f) #文件的读操作
with open('data.txt', 'w') as f:
f.write('hello world') #文件的写操作
模拟登录
爬取基于某些用户的用户信息
cookie
用于让服务器端记录客户端的相关状态
手动cookie处理
通过抓包工具获取cookie值,将该值封装到headers(不建议使用)
自动处理
cookie的值来源是模拟登录post请求后,由服务器端创建
session会话对象
作用
1.可以进行请求发送
2.如果请求过程中产生了cookie,则该cookie会被自动存储发送
创建一个session对象:session = requests.Session()
使用session对象进行模拟登录post请求的发送(cookie就会被存储在session中)
session对象对个人主页对应的get请求进行发送(携带了cookie)
代理
破解封IP这种反爬机制
作用
突破自身IP访问的限制
隐藏自身真实IP
相关网站
http://ip.yqie.com/ipproxy.htm
代理IP的类型
http:应用到http协议对应的url中
https:应用到https协议对应的url中
代理ip的匿名度
透明:服务器知道该次请求使用了代理,也知道请求对应的真实ip
匿名:知道使用了代理,不知道真实ip
高匿:不知道使用了代理,更不知道真实ip
一些错误
乱码
#可以手动设定数据编码的格式
#response.encoding = 'utf-8'
#通用处理中文乱码的解决方案
img_name = li.xpath('./a/img/@alt')[0] + '.jpg'
img_name=img_name.encode('iso-8859-1').decode('gbk')
list index out of range
原因是在中这个网站的html代码中有的标识为空,只要加上try.....except IndexError: pass 错误机制跳过空值就行了
高性能异步爬虫
目的:在爬虫中使用异步实现高性能的数据爬取操作
异步爬虫方式
多线程,多进程(不建议)
好处:可以为相关阻塞操作单独开启线程或者进程,阻塞操作就可以异步执行
弊端:无法无限制的开启多线程或者多进程
进程池,线程池(适当使用)
好处:我们可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统开销
弊端:池中线程或者进程的数量是有上限的
单线程+异步协程(推荐)
event_loop
事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行
coroutine
协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用,我们可以使用async关键字来定义一个方法,这个方法在调用时不会被立即执行,而是返回一个协程对象
task
任务,它是对协程对象的进一步封装,包含了任务的各个状态
future
代表将来执行或还没有执行的任务,实际上和task没有本质区别
async
定义一个协程
await
用来挂起阻塞方法的执行
selenium
便捷的获取网站中动态加载的数据
便捷实现模拟登录
基于浏览器自动化的一个模块
使用流程
下载一个浏览器的驱动程序
实例化一个浏览器对象
编写基于浏览器自动化的操作代码
操作代码
发起请求:get(url)
标签定位:find系列方法
标签交互:send_keys(" " )
执行js程序:excute_script('jsCode')
前进,后退:forward(),back()
关闭浏览器:quit()
处理iframe
如果定位标签存在于iframe标签之中,则必须使用swich_to.frame*id)
动作链:from selenium.webdriver import ActionChains
click_and_hole(div):长按且点击操作
move_by_offset(x,y)
perform()让动作链立即执行
action.release()释放动作链对象
scrapy框架
爬虫中封装好的一个明星框架
功能
高性能的持久化存储
异步的数据下载
高性能的数据分析
分布式
基本使用
创建一个工程 :scrapy startproject xxx
cd xxx
在spiders子目录中创建一个爬虫文件
scrapy genspider spiderName www.xxx.com
执行工程:scrapy crawl spiderName
持久化存储
基于终端指令
只可以将parse方法的返回值存储到本地文本文件
scrapy crawl 对应的爬虫文件名 -o ./filePath
注意:持久化存储对应的文本文件的类型值可以是('json', 'jsonlines', 'jsonl', 'jl', 'csv', 'xml', 'marshal', 'pickle')
局限性比较强(数据只可以存储到指定后缀的文本文件中)
基于管道
数据解析
在item类中定义相关的属性
将解析的数据封装存储到item类型的对象
将item类型的对象提交给管道进行持久化存储
在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作
在配置文件中开启管道
分布式爬虫
搭建一个分布式机群,让其对一组资源进行分布联合爬取
提升爬取数据效率
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。