首页 / 爬虫 / 网络数据采集——爬虫
网络数据采集——爬虫
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了网络数据采集——爬虫,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9045字,纯文字阅读大概需要13分钟。
内容图文
![网络数据采集——爬虫](/upload/InfoBanner/zyjiaocheng/1037/7ed3d7d494914d0498f473855742cfbb.jpg)
网络数据采集 ----> 爬虫(蜘蛛)
中小企业是很缺乏数据,要么选择购买数据,要么选择爬虫采集数据
-
-
怎么写爬虫程序?
- 获取页面的代码 —> HTML —> 数据放在HTML标签中 —> requests
- 解析HTML页面 —> 正则表达式( ) / XPath / CSS选择器() —> beautifulsoup4
- 数据的持久化 —> 文本文件(CVS)/ Excel / 数据库
-
-
写爬虫程序违法吗?
- 灰色地带 —> 法不禁止即为许可
- 如果被目标网站举证你有破坏别人动产的行为,打官司基本败诉
- 遵循爬虫协议 —> robots.txt
- 如果不想遵守爬虫协议 —> 隐匿自己的身份(让目标网站感觉不到你是一个爬虫程序,而是一个来自浏览器的正常请求)
-
-
爬虫的分类:
- 通用爬虫
- 定向爬虫(只关注某领域的数据)
-
-
HTML
- Hyper-Text Markup Language -----> 超文本标签语言
- 浏览器就是HTML语言的解释器,它能够执行HTML书写的代码
- HTML页面最核心的就是标签,除了标签之外,还有CSS和JavaScript
HTML = Tag(标签)+ CSS(层叠样式表)+ JavaScript(JS)
Tag ----> 数据(content)
CSS ----> 显示(display) —> 选择器
JS ----> 行为(behavior) —> 代码 -
-
URL和URI
- URI —> 统一资源标识符 —> Universal Resource Identifier —> 网络上的一个资源的唯一标识
- URI —> URL + URN(urn:isbn:978-7-5596-0344-9)
- URL —> 网址 —> Uniform Resource Locator —> 统一资源定位符
https://username:password@www.sohu.com:443/path1/path2/index.html
协议://用户名:口令@主机(服务器域名或IP地址):端口号/路径/子路径/资源名称 -
-
HTTP —> 超文本传输协议
-
请求
- 请求行:请求方式 请求路径 协议版本
-
-
请求头:键值对
- Host —> 请求的主机
- Accept —> 接受的内容类型
- User-Agent —> 操作系统和浏览器平台 —> 如果爬虫要伪装成浏览器,就需要设置该项
- Accept-Language —> 浏览器的语言设定
- Accept-Encoding —> 编码和压缩方式
- 空行
- 消息体:浏览器要发给服务器的数据
-
响应
-
-
响应行:协议版本 响应状态码
- 2xx:成功
- 3xx:重定向
-
4xx:请求有问题
- 404:Not Found —> 找不到对应的资源
- 401:Unauthorized —> 未授权
- 403:Forbidden —> 禁用(没有权限)
- 405:Method not Allowd —> 请求的方式不对
- 418:I am a tea pot —> 服务器给不了你想要的内容
- 5xx:服务器卵了
- 响应头:键值对
- 空行
- 消息体:服务器给浏览器的内容 —> (如果请求的是网页,消息体里面就是HTML代码;如果请求的是图片,消息体里面就是图片的二进制数据)
-
-
-
-
HTTPS
-
HTTP over SSL (Secure Socket Layer) —> 安全的HTTP
- 对称加密:加密和解决使用同一个密钥 —> 保护通信内容,通信内容是用每次产生的随机密钥进行加密
- 非对称加密:加密和解密使用不同的密钥(公钥,私钥)—> 保护随机密钥,只有持有私钥的服务器放可以解密随机密钥
-
HTTP over SSL (Secure Socket Layer) —> 安全的HTTP
-
-
服务器如何识别用户是否登录
-
方法一:
用户登录成功后,服务器端会创建一个对象,这个对象里面就保存了用户相关的数据,
这个对象通常我们称之为Session(会话对象),服务器出了创建保留这个会话对象之外,
还会在响应中要求浏览器记录一条Cookie数据,Cookie中保存了会话对象的ID(标识符),
下一次请求的时候,在HTTP请求头中携带上Cookie数据,服务器就可以获取到会话的ID,
这样的话,服务器根据这个ID就可以找到之前为用户创建的会话对象,里面就有用户的信息。 -
方法二:
用户登录成功后,服务器端不保存任何对象,但是服务器会将用户的数据生成一个身份令牌,
然后将身份令牌返回给浏览器(可以保存在Cookie中,也可以保存在其他的浏览器本地存储中),
下一次请求的时候,在请求头中带上这个身份令牌(Authentication),服务器读取身份令牌,
获取用户身份令牌中的数据来判定用户是否已然登录。
-
方法一:
-
-
使用商业IP代理 —> 高匿代理
- 隐匿自己的身份
- 突破网站对访问IP段的限制
- 通过多个IP代理轮流使用,避免一个IP地址被封禁或限流 商业IP代理哪家强?
- 可用性、访问速度、价格
- 蘑菇代理、芝麻代理、快代理、讯代理、阿布云代理
-
-
调用三方服务 —> 自己的程序中解决不了的问题就可以依赖三方服务
- 免费
- 付费
数据聚合服务 —> 把常用的服务器整合到一起,让你免费或付费来使用
-
Ajax —> 为页面生成动态内容的一种技术
Asynchronous JavaScript and XML —> JSON
~ 浏览器可以在不中断用户体验的前提下,向服务器发起异步请求(在浏览器后台发生,用户感知不到)
~ 服务器在收到浏览器发出的异步请求之后会返回数据,数据通常都是使用JSON格式
~ 浏览器获得JSON数据之后,就会使用JavaScript对页面进行局部渲染,生成动态的内容如果要抓取这些动态内容,我们可以在浏览器的开发者工具中截获异步请求,找到获取数据的URL
开发者工具 —> Network —> XHR (XMLHttpRequest) and Fetch
-
-
requests库
-
get / post / …
- url
- params —> 查询参数(URL参数) —> 跟在URL问号后面的参数
- data —> post请求发给服务器的数据 —> {‘参数名’: ‘参数值’}
- headers —> HTTP请求头 —> User-Agent / Cookie / Accept
- proxies —> 设置代理服务器 —> HTTP / SOCKS
- files —> 上传文件(post请求)
- verify —> HTTPS证书验证(True/False)
- timeout —> 请求超时时间
- Session对象 —> get() / post()
-
Response对象
- text / content / json()
- cookies —> 服务器向浏览器写的临时数据
- status_code —> 响应状态码
-
get / post / …
-
-
页面解析
- 正则表达式解析 —> re —> compile / search / match / findall / finditer
-
CSS选择器解析 —> beautifulsoup4 / pyquery —> BeautifulSoup
—> select() / select_one() —> text / attrs[’…’]- 标签选择器、属性选择器、类选择器、ID选择器
- 各种选择器的组合(父子、后代、兄弟)
- 伪类/伪元素
- XPath解析 —> lxml
-
-
Selenium —> Appnium
- chromedriver —> PATH —> 放在虚拟环境中或者Python解释器放在一起
- browser = webdriver.Chrome(options) —> ChromeOptions
- 加载页面:browser.get(’…’)
-
隐式等待或者显示等待
- browser.implicitly_wait(10)
- WebDriverWait(browser, 10) —> until —> 期望条件
expected_conditions.presence_of_element_located((By.ID, ‘…’))
-
获取页面元素(标签):—> 可以获取动态内容
- page_source —> 带动态内容的HTML页面 —> 正则表达式解析
-
-
find_element_by_css_selector(’…’) —> WebElement
- send_keys():模拟输入
- click():模拟点击
- text:获取标签中的内容
- get_attribute(’…’):获取标签指定属性
- location:获取标签在浏览器窗口中的位置
- size:获取标签的宽度和高度
- is_displayed():判断元素是否可见(不可见的a标签很有可能是蜜罐链接,诱使爬虫去访问的)
- find_element_by_xpath(’…’) —> XPath语法不会写也是在浏览器开发者工具中直接拷贝
- find_elements_by_css_selector(’…’) —> [WebElement, …]
- find_elements_by_xpath(’…’)
- 关闭浏览器对象 —> browser.close()
-
switch_to属性 —> 切换浏览器窗口 —> window() / frame()
- browser.switch_to.window(browser.window_handles[2])
-
Python中的并发编程
并发(concurrency):加入程序中有两个需要执行的部分A和B,通过A和B的轮流切换,达到让外界感觉A和B在同时执行的效果。
并行(parallel):程序中有多个部分同时执行,前提条件是计算机需要有多个CPU或者CPU有多核。进程:启动一个程序,通常就启动了一个或多个进程,进程是操作系统分配内存的基本单位。
线程:一个进程中通常包含了一个或多个线程,线程是比进程更小的单元,也是操作系统分配CPU的基本单位。-
python test.py —> 启动一个Python解释器进程,该进程中只有唯一的一个主线程。
-
多线程
- Thread(target=…, args=(…), kwargs={…}, daemon=True)
—> start():启动线程
—> join():等待线程结束
—> is_alive():线程是否还在运行
—> terminate():终止线程 - 继承Thread类,重写run()方法
- ThreadPoolExecutor(max_workers=…) —> submit(…) / map(…)
—> Future —> result() - threading.current_thread() —> 获取当前正在执行的线程对象
- 守护线程:不值得保留,主线程结束即便守护线程还没有执行完,也就不再执行了
- 多个线程竞争一个资源 —> 线程不安全对象 —> RLock
—> acquire() / release()
—> with lock: -
-
GIL —> Global Interpreter Lock(全局解释器锁)
- malloc() / free()
- 只有获得GIL的线程能够执行 —> 无法发挥CPU多核特性的优势
-
-
CPython中多线程到底有没有用?
- 有用
- 提高程序对CPU的占用率
- 改善用户体验(程序不会因为一个地方的阻塞陷入假死状态)
- I/O密集型任务(需要太多的CPU处理,主要是I/O操作),多线程足以胜任,也用不上多核特性
- 对于计算密集型任务(处理渲染图像、压缩文件、视频解码、音视频压缩解压缩)可以使用多进程
- Thread(target=…, args=(…), kwargs={…}, daemon=True)
-
多进程
- Process类,用法跟Thread类类似
- ProcessPoolExecutor —> 进程池
- IPC(Inter-Process Communication)机制 —> 管道 / 套接字 / 共享存储区
-
异步编程(异步I/O)
- BIO - 阻塞式IO —> 一个壶烧水,必须等着水烧开
- NIO - 非阻塞式IO —> 多个壶烧水(多路IO操作),轮流观察哪个水烧烤了
- AIO - 异步IO —> 多个壶烧水,你可以去干别的事情,哪个壶烧开了就发出响声
协程(coroutine) —> 异步编程
可以相互协作的子程序 —> 协作式并发(谁发生了IO中断,就主动将CPU让给其他子程序,CPU没有闲着,利用率自然就提高了)生成器 —> 迭代器的语法简化升级版本
生成器可以通过预激活操作升级为可以和其他子程序协作的协程协程 —> 微线程 —> 纤程
Python 3.4引入协程 —> 基于生成器实现协程
Python 3.5引入async/await —> 编写异步函数 —> 协程对象
Python 3.7中async和await成为正式关键字- aiohttp / httpx
CPython ----> C ----> 官方 ----> Anaconda
Jython —> Java
IronPython —> C#
PyPy ----> Python ----> 性能最好 ----> JIT -
-
常见反爬机制及其应对策略
CAPTCHA —> OCR(Optical Character Recognition)teserract —> pyteserract —> 弱爆了
easyocr —>-
pillow —> PIL —> Python Image Library
- 普通验证码 —> easyocr
- 行为验证码 —> 打码平台 —> 超级鹰
- 短信验证码 —> 接码平台 —> 隐私短信
- 字体反爬 —> 文档
-
模拟登录
-
爬取手机App —> 抓包(找到提供数据的URL) / Appnium / Airtest
-
爬虫框架Scrapy / PySpider
-
数据去重
需要一个很大的bit数组 —> [0, 0, 0, 0, …, 0, 0]
~ 布隆过滤器 —> 三次hash运算 —> 位置 —>
0 - 不重复 - 保存数据 - 0修改为1
1 - 重复 - 不保存
有一定的误判的概率,就是把不重复的元素会判断为重复的~ SimHash
Hash函数:对象 ----> 哈希值 ----> 对象的数字签名(数字指纹)
好的哈希函数,对象不同,哈希值一般情况就是不同的MD5 / SHA1 / SHA256
https://s.taobao.com/search?q=%E5%B0%8F%E7%B1%B3%E6%89%8B%E6%9C%BA&s=88
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E9%AA%86%E6%98%8A&fenlei=256&rsv_pq=b6174c5a0002b383&rsv_t=5537CuSO%2BclLjPB7rVZAs1Ls2wEDRDhwi%2FXoHTH9CDjCOxKuCuQRLzpSFRg&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=7&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&prefixsug=%25E9%25AA%2586%25E6%2598%258A&rsp=5&inputT=1446&rsv_sug4=1446
ASCII —> 128
如果URL中有非ASCII字符,都必须要处理成百分号编码
内容总结
以上是互联网集市为您收集整理的网络数据采集——爬虫全部内容,希望文章能够帮你解决网络数据采集——爬虫所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。