爬虫的总结汇总
爬虫介绍
1.爬虫是否违法?
~ 法不禁止即为许可
~ 隐匿自己的身份 ---> 商业IP代理
~ 不要被目标网站举证有破坏动产行为
2.爬虫的分类和作用?
~ 通向爬虫 ---> 搜索引擎
~ 定向爬虫 ---> 有具体的爬取目标
~ 尽量遵守爬虫协议 ---> robots.txt
3.爬虫怎么写
~ 抓取页面 ---> requests / aiohttp
~ 解析页面
- 正则表达式 ---> re (regular expression)
~ compile() ---> Pattern
~ search / match ---> Match ---> group()
~ findall() ---> list
- XPath解析 ---> lxml
~ 浏览器的开发者工具 ---> Copy ---> Copy full XPath
- CSS选择器解析 ---> beautifulsoup4 / pyquery
~ BeautifulSoup
- select():获取跟CSS选择器匹配的元素 ---> list
- select_one():获取跟CSS选择器匹配的第一个元素 ---> WebElement
~ text: 获取标签中的内容
~ attrs: 字典,通过键值对的方式获取标签的属性值
~ 保存数据
- CSV(逗号分割值文件) ---> csv
reader / writer ---> writerow()
- Excel ---> xlrd / xlwt / openpyxl (excel版本有关)
- Workbook ---> 工作簿 ---> create_sheet()
- ---> Worksheet ---> 工作表 ---> cell(row, col, value) ---> 单元格
4.如何抓取动态内容?
- 直接找到提供JSON数据的接口
游览器开发者工具 ---> Network ---> XHR ---> 提供异步数据的接口
专业的抓包工具 ---> Charles / Fiddler / Wireshark
- Selenium驱动游览器获取动态内容
- 自动化测试工具
- IDE
- Remote Control
- WebDriver: 驱动游览器模拟用户操作 ---> 抓取到动态内容
- Chrome()
- get() 加载页面
- 隐式等待 / 显示等待
- implictly_wait(10): 如果元素在10秒内没有出现就引发异常
- WebDriverWait(browser, 10) ---> until() ---> 指定等待条件
- page_source: 页面带动态内容的HTML代码
- find_element_by_xxx() ---> Tag
- find_elements_by_xxx() ---> [Tag]
- text:获取标签中的文本内容
- get_attribute(): 获取标签属性
5.如何实现并发(并行)编程?
并行: 真正的同时进行, 需要多CPU的支持
并发: 可能不是真正的同时进行,但是通过快速的切换制造出并行的效果
线程: 操作系统分配CPU的基本单位,最小的执行单元
进程:操作系统分配内存的基本单位,是程序在一组数据上的活动
通常启动一个程序,就启动了一个(或多个)进程,一个进程中,又可以包含一个或多个线程
单线程(只有主线程煤制油唯一的一个执行线索)
- 多线程 ---> I/O密集型任务(爬虫) ---> GTL(全局解释器锁) ---> 无法使用cpu的多核特性
- 多进程 ---> 计算密集型任务(音视频的编解码、文件压缩、机器学习算法)
- 异步编程 ---> I/O密集型任务(爬虫) ---> 通过提高CPU利用率达到协作式并发
6.easyocr 验证码解决掉---> ocr(optical character recognition)
pip install easyocr
多线程
from concurrent. futures. thread import ThreadPoolExecutor
with ThreadPoolExecutor( max_workers= 32 ) as pool:
f1 = pool. submit( download, 'Python从入门到住院' )
f1. result( )
多进程
from multiprocessing import Process
with ProcessPoolExecutor( max_workers= 32 ) as pool:
f1 = pool. submit( download, 'Python从入门到住院' )
f1. result( )
爬虫基础1:页面的内容的获取 —— requests
1 . 获取页面内容:
requests. get( url)
response = requests. get( 'https://baidu.com' )
2 . 获取页面内容
1 )获取页面内容原数据( 类型时二进制) - 主要针对图片,视频,音频
print ( response. content)
2 )获取页面的内容文本格式数据 - 针对网页
print ( response. text)
3 )将获取的内容进行json转换 - 针对返回数据时json数据的接口
print ( response. json( ) )
3 . 天年假客户端信息 - 伪装成游览器 - 在不能直接requests的时候使用,先使用User- Agent, 不行再使用Cookie。两个都在页面的Network中查找
hearders = {
'User-Agent' : '' ,
'Cookie' : ''
}
response = requests. get( url, headers= headers)
解决中文显示编码值的问题:
response. text. encode( ) . decode( 'unicode_escape' )
爬虫基础2:页面的内容获取 —— selenium的使用
1 . 创建游览器对象并加载页面
from selenium import webdriver
driver = webdriver. Chrome( )
driver. get( url)
2 . 游览器对象的基本配置
options = webdriver. ChromeOptions