spider_review
1.example01
import requests
session = requests.Session()
session.verify = False
session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
})
response = session.get('https://movie.douban.com/top250')
print(response.status_code)
print(response.text)
2.example02
import re
import openpyxl
import requests
from openpyxl.cell import cell
from openpyxl.styles import Font, Alignment
pattern = re.compile(r'<a\s.*?href="(?P<foo>.*?)".*?title="(?P<bar>.*?)".*?>')
resp = requests.get('https://www.sohu.com/')
iter_obj = pattern.finditer(resp.text)
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = '搜狐新闻'
sheet.row_dimensions[1].height = 35
sheet.column_dimensions['A'].width = 80
sheet.column_dimensions['B'].width = 120
sheet.cell(1, 1, '标题')
sheet.cell(1, 2, '链接')
font = Font(size=18, name='华文楷体', bold=True, color='ff0000')
alignment = Alignment(horizontal='center', vertical='center')
for col_index in 'AB':
curr_cell = sheet[f'{col_index}1']
curr_cell.font = font
curr_cell.alignment = alignment
for index, matcher in enumerate(iter_obj):
sheet.cell(index + 2, 1, matcher.group('bar'))
sheet.cell(index + 2, 1, matcher.group('foo'))
wb.save('爬虫数据文件.xlsx')
3.example03
from selenium import webdriver
browser = webdriver.Chrome()
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
browser.get('https://www.baidu.com')
browser.implicitly_wait(10)
anchor = browser.find_element_by_css_selector('#s-top-left > a:nth-child(7)')
print(anchor.is_displayed())
print(anchor.size)
print(abchor.location)
browser.get_screenshot_as_file('resources/daidu.png')
4.example04
import easyocr
reader = easyocr.Reader(['ch_sim', 'en'], gpu=Flase)
print(reader.readtext('resources/idcard.jpg', detail=0))
5.example05
from PIL import Image as img
from PIL import ImageFilter
from PIL import import Image
image = img.open('resources/idcard.jpg')
print(image.size)
emboss_image = image.filter(ImageFiter.EMBOSS)
emboss_image.show()
head = image.crop(320, 50, 460, 235)
head.save('resources/head.jpg')
6.example06
1. 爬虫的合法性探讨
~ 法不禁止即为许可
~ robots协议
~ 隐匿身份
- 高匿商业代理
- TOR(洋葱路由)
2. 爬虫的分类
~ 通用爬虫
~ 定向爬虫
3. 爬虫程序的一般步骤
URL ---> Universal Resource Locator
URI ---> Universal Resource Identifier
URI = URL + URN
协议://用户名:口令@域名或IP地址:端口/路径1/路径2/资源名称
https://www.baidu.com:443/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
HTTP / HTTPS ---> 超文本传输协议
HTTP请求 --------> 服务器
请求行 - 命令(GET/POST) 资源路径 协议版本
请求头 - 键值对
空行
消息体 - 发给服务器的数据
HTTP响应 <-------- 服务器
响应行 - 协议版本 响应状态码
响应头 - 键值对
~ content-type ---> MIME
- text/html
- application/json
- text/xml
- application/pdf
- image/jpeg
- image/png
空行
消息体 - 服务器返回的数据
~ 抓取页面
- urllib
- requests
get() / post() ---> Response ---> text / content / json()
Session ---> get() / post()
~ 解析页面
~ 数据持久化
- CSV ---> csv ---> writer() ---> csv.writer ---> writerow / writerows
4. HTML页面的结构
超文本标签语言 ---> 所有的内容都放在标签下
~ 标签:承载内容
<p> / <h1> / <a> / <img> / <li>
~ CSS(Cascading Style Sheet):页面渲染
选择器 ---> 样式属性名: 样式属性值
- 标签选择器
- 类选择器
- ID选择器
- 父子选择器 ---> div > p
- 后代选择器 ---> div p
- 兄弟选择器 ---> div ~ p
- 相邻兄弟选择器 ---> div + p
- 伪类/伪元素 ---> a:visited / p:first-letter
~ JavaScript(JS):交互式行为
5. 解析页面的三种方式
~ 正则表达式解析 ---> re
- 直接调用re模块的函数
~ search / findall / finditer
- 创建Pattern对象,给对象发消息
~ compile ---> Pattern
~ search ---> Match ---> group()
~ findall / finditer
~ CSS选择器解析
- BeautifulSoup ---> beautifulsoup4 ---> import bs4
- PyQuery ---> pip install pyquery ---> 有jQuery使用经验
~ XPath解析
- lxml ---> pip install lxml
6. 数据持久化
~ CSV文件
~ Excel文件
~ 数据库
~ 大数据平台
7. 常见的反爬方式及破解
~ 请求头检查
- User-Agent
- Referer ---> 网站防盗链接
- Accept
- Accept-Language
- Accept-Encoding
~ 限速和封禁IP
- 商业IP代理 ---> 蘑菇代理 / 芝麻代理 / 快代理 / 讯代理 / 阿布云代理
- 代理池(提前放置好一堆代理,有对应的维护机制,能够动态替换掉失效代理)
~ 身份验证
- 服务器如何识别你是否登录?
~ 从请求中获取用户的身份标识
~ 对于登录成功的用户,服务器通常会将用户身份标识写入浏览器本地存储
- Cookie
- localStorage / sessionStorage
- IndexedDB
---> 下次请求要带上自己的身份标识(修改请求头、修改Cookie信息)
- Cookie池(提前准备好多个登录用户的身份信息,轮换着使用)
~ 动态内容
- 抓取接口
~ 浏览器开发者工具 ---> Network ---> Fetch/XHR(异步请求)
~ 专业(HTTP)抓包工具
- Charles / Fiddler ---> 将它设置为浏览器的代理
- WireShark ---> Ethereal ---> 协议分析工具
- Selenium WebDriver ---> 用代码驱动浏览器
- Puppeteer ---> Pyppeteer ---> Chromium
~ 爬虫蜜罐
- Selenium ---> WebElement ---> is_displayed()
~ 验证码
CAPTCHA ---> 图灵测试
OCR ---> Optical Character Recognition
teseract ---> pytesseract
- easyocr
- 打码平台
~ 字体反爬
~ JS加密和混淆