python爬虫二十六:css反爬及文字混淆

1、爬取自如网价格

①网址:自如网点击查看,进入后点击租房,接下来就是爬取房价信息,以及其它想要提取的数据
②分析流程:他所有的内容均在网页源代码中,不用去寻找api接口,皆大欢喜,但它的价格是css加密过的,即点击styles中的不显示红框中的内容,它的价格就会发生变化,复制它的url地址,会发现是一张雪碧图(爬取的价格图片背景像雪碧,所以叫做雪碧图),它的价格是根据像素点的变化,定位雪碧图的不同数字显示的
③实现思路:获得图片,通过图片识别,将像素点(偏移量)根雪碧图的数字一一对应,爬取像素点(偏移量),将识别出来的数字替换偏移量显示价格,实现价格的爬取。(css反爬一般都是通过这种位移的方式来保护它的数据的)
在这里插入图片描述

在网页源代码中找到了页面返回的所有数据
在这里插入图片描述
点击url会显示如下的雪碧图,价格就是通过这个图片的像素点显示的(下图是通过爬虫获取的,直接点开背景会是黑色的)
在这里插入图片描述
④代码实现:
价格的获取


from lxml import etree
from fake_useragent import UserAgent  # 导入一个ua类
import requests


def get_info():
    uas = UserAgent()
    ua = uas.random  # 随机选取一个ua
    url = "http://www.ziroom.com/z/"
    header = {
        "User-Agent": ua
    }
    r = requests.get(url, headers=header)
    html = r.text
    dom = etree.HTML(html)
    divs = dom.xpath('//div[@class="Z_list-box"]/div[@class="item"]/div[@class="info-box"]')
    for div in divs:
        dict1={}
        name = div.xpath('./h5/a/text()')
        price_list = []
        prices = div.xpath('./div[@class="price "]/span/@style')
        dict1['name']=name[0]
        for item in prices:
            r = item.split(':')
            price_list.append(r[-1])
        dict1['price']=price_list
        print(dict1)
    return dict1
get_info()


在这里插入图片描述
图片的破解(有很多方式,用我的方式得安装pytesseract或者用打码平台实现,实现过程我以前的文章有写)把两个一整和就可拿到30条数据,在构建一个列表推导式,就可以翻页获取,具体逻辑不写了,很简单,就是要调试,不想写了

import re, requests,pytesseract
from PIL import Image # PIL pillow python imaging libray(图像处理库,目前已经停止更新维护了)
from lxml import etree
from fake_useragent import UserAgent  # 导入一个ua类



uas = UserAgent()
ua = uas.random  # 随机选取一个ua
url = "http://www.ziroom.com/z/"
header = {
    "User-Agent": ua
}
r = requests.get(url, headers=header)
html = r.text
p_url = 'http:' + re.findall(r'<span class="num" style="background-image: url\((.*?)\);background-position: .*?px"></span>', html)[0]
dom = etree.HTML(html)

r =requests.get(p_url, headers=header)

with open('zr.png', 'wb') as f:
    f.write(r.content)
pytesseract.pytesseract.tesseract_cmd = r'F:\Tesseract-OCR\tesseract.exe'  # 指定Tesseract的安装路径和数据包的路径
tessdata_dir_config = r'--tessdata-dir "F:\Tesseract-OCR\tessdata"'
image = Image.open('zr.png')
captcha = pytesseract.image_to_string(image, lang='eng',  config=tessdata_dir_config)
print(captcha,type(captcha))
offsets = ['-0px', '-21.4px', '-42.8px', '-64.2px', '-85.6px', '-107px', '-128.4px', '-149.8px', '-171.2px', '-192.6px']
nums = []
for i in captcha.replace(' ',''):
    nums.append(i)
dic = {}
for k, v in zip(offsets, nums):
    dic[k] = v
    print(k, v)

在这里插入图片描述

2、字体反爬

①前言:一般用于论坛,一些评论不会让我们直接爬取,会以字体加密的方式,具体以汽车之家的评论数据为例具体信息点击查看,会发现定位到评论之后,并没有完整的评论,而是有部分以特殊符号拼接了,这就是为了防止我们直接获取数据的字体反爬
在这里插入图片描述
②逻辑分析:发现是字体反爬,去全局中搜索字体,定位之后找到它使用的字体文件,去下载,搜索百度字体平台点击fonteditor,打开下载的文件,它的文字加密就是通过下面的字加的密,凡是遇到了下面的字就会以编码显示,这就是字体反爬也叫做文字混淆,只需要将对应的编码重新替换为汉字就可以解决这个问题
在这里插入图片描述
在这里插入图片描述
获取之后加密的字就会乱码,虽然大致意思可以理解,但要做的就是字体反爬
在这里插入图片描述
汉字我没写完,具体逻辑和代码实现完毕,要将看到的字一个个输入进去做替换,所有的字体混淆就是他用了不同的字体文件,只要将它的字体做个替换就可以实现

import requests
from lxml import etree
from fontTools.ttLib import TTFont

url = "https://club.autohome.com.cn/bbs/thread/665330b6c7146767/80787515-1.html"
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
}
r = requests.get(url, headers=header)
chtml = r.text
html = etree.HTML(chtml)
content_list = html.xpath("//div[@class='tz-paragraph']//text()")
content_str = ''.join(content_list)
print(content_str)
font = TTFont('wKgHFVsUz1eAH_VRAABj9PS-ubk57..ttf')
unilist = font.getGlyphOrder() # 获得所有加密的汉字的编码
# print(unilist) # '\uedb8'.... '\uedff'这就是百度文字平台的加密数据的编码格式,要做切片处理
res = []
for i in unilist[1:]:
    s = r"\u" + i[3:]
    res.append(s)
word_list = ['很', '五', ''...]  # 将汉字逐个写上,为待会替换做准备
for i in range(len(res)):
    content_str = content_str.replace(unilist[i], word_list[i])
print(content_str)


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值