spider_review

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/')
# finditer方法会返回一个迭代器对象
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']  # type: cell
    curr_cell.font = font
    curr_cell.alignment = alignment
# 通过对迭代器对象的循环遍历可以获得Match对象
for index, matcher in enumerate(iter_obj):
    # 获取整个a标签
    # print(matcher.group())
    # 获取捕获组的内容
    # print(matcher.group('bar'))
    # print(matdher.gronp('foo'))
    sheet.cell(index + 2, 1, matcher.group('bar'))
    sheet.cell(index + 2, 1, matcher.group('foo'))
    
# 保存工作簿
wb.save('爬虫数据文件.xlsx')

# 跟据正则表达式匹配a标签的href和title属性得到一个列表
# anchors_list = pattern.findall(resp.text)
# for href, title in anchors_list:
#	print(href)
#	print(title)

3.example03

from selenium import webdriver
browser = webdriver.Chrome()

# 破解selenium反爬最重要的一行代码
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)')
# 通过WebElement对象is_displayed方法判定元素是否可见
# 注意: 不可见的超链接一般都不能访问,因为它极有可能是一个诱使爬虫访问的蜜罐链接

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')   # type: Image
print(image.size)
# 使用滤镜处理图片
emboss_image = image.filter(ImageFiter.EMBOSS)
emboss_image.show()
# 抠图
head = image.crop(320, 50, 460, 235)
# 显示图片
# head.show()
# 保存图片
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加密和混淆
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值