前两天做到爬取租房网站的一个爬虫题目诈一看还挺简单(之前从来没有爬过租房网站)下一刻我就后悔了里面的数字竟然是乱码瞬间不知所措(奔溃边缘徘徊)就是这个东西这是个嘛

也没学过类似于这种解码的东东然后就疯狂的找博客(写的是不少,能用的却没几个)最终在昨天寻找到了一篇还算比较靠谱的博客(大神)https://blog.csdn.net/qq_38105596/article/details/90177458对没错就是他,然后我就将大佬写的尝试着与我写的结合(结果脑子都停转了去这是个啥)好在皇天不负有心人,对没错就在此刻我终于成了(啊哈哈哈)
然后我就来分享我的喜悦来了(哦哈哈哈)我自己也总结了一下

F12查看那个价格在最右边看到了fangchan-secret对没错就是它在捣乱(好气的有木有)

我们复制它然后就右键查看网页源代码然后F3开始进行搜索咯就到了下面那个红框框里面的内容(没错就是它)这就是它的字体

现在我们做的就是要用正则表达式将它里面的内容取出来(因为会随着网页变化里面内容也会变化,之前不知道就直接复制过来然后数字飞到了天上8080年56月78日运行它就知道什么是绝望https://blog.csdn.net/zql200008/article/details/103973085)

base64_str = re.findall(";src:url\('(data.*)'\)\sformat\('truetype'\)")

引用包base64和字体包进行base64二进制解码,将字体文件写入了ttf字体文件和xml文件中

import base64
from fontTools.ttLib import TTFont
from io import BytesIO

然后解析映射关系出来一大堆这样的东西(看了一大堆博客终于知道了glyph00000没有意义,glyph00001对应0,glyph00001对应2以此类推)

知道这些过后就可以开始写我的爬虫代码了(我需要的是详细页面中的详细内容)确定找到全部的list列表

all_list = selector.xpath('//*[@class="zu-itemmod"]')       #当页中全部数据列表


为了找到每一个的详细内容我们需要知道每一个的URL(就是它)

all_list = selector.xpath('//*[@class="zu-itemmod"]')       #当页中全部数据列表for sel in all_list:url_a = sel.xpath('div[1]/h3/a/@href')[0]       #获取到每一页的URLparse_id_detail(url_a)   #这是为下面的def

这样我们就得到了全部的listURL

进入到每一页的URL中寻找我们需要的内容(呐就是这些)

写一个函数确保我们需要的每个URL都可以获取内容

def parse_id_detail(url_a):alls = requests.get(url_a,headers=headers)alls.encoding='utf-8'selector = etree.HTML(alls.text)time.sleep(random.randint(0,1))     #0~1秒爬取一次items=[]item = {}#房间价格(像这样的列子可以将其他的都提取)price = selector.xpath('string(//*[@class="house-info-zufang cf"]/li[1]/span)')item['price'] = priceitems.append(item) #   最后的数据整合

最后就要将获取的数据保存咯(这里我的题目要求是json形式保存,你们也可以用其他类型)

#   将数据已json数据存储with open('all.json','a',encoding='utf-8')as fp:fp.write(json.dumps(item,ensure_ascii=False)+",\n")

最后查看一下自己成果(部分数据)不像昨天的数字了哈哈,到这就全部结束了

完整代码(可以运行哦)

import requests
from lxml import etree
import time
import json
import random
import base64
from fontTools.ttLib import TTFont
import re
import io
from io import BytesIO
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36','accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9','upgrade-insecure-requests': '1','cookie': 'aQQ_ajkguid=09A0859E-56ED-A4F5-FE95-0F8ABAFBC4AC; wmda_uuid=4a0dbfab14068b19e566debfe70c2dcf; wmda_new_uuid=1; wmda_visited_projects=%3B6289197098934; 58tj_uuid=73c0cdaa-d302-4b2c-8cf4-1c62d8b6659f; als=0; _ga=GA1.2.96530944.1578966491; propertys=whnmwe-q44kyx_; wmda_uuid=886d70f232fee67c4427552d29fd05b0; wmda_new_uuid=1; wmda_visited_projects=%3B6289197098934; _gid=GA1.2.1145441305.1579170985; ctid=25; new_uv=6; __xsptplus8=8.6.1579179711.1579179711.1%232%7Csp0.baidu.com%7C%7C%7C%25E5%25AE%2589%25E5%25B1%2585%25E5%25AE%25A2%25E7%25A7%259F%25E6%2588%25BF%7C%23%23x7AYCEBQRu_RcWofOkvpyL6hkXr4q-wj%23; lps=https%3A%2F%2Fwx.zu.anjuke.com%2F%3Fkw%3D%26k_comm_id%3D%7C; sessid=A809ED45-A40B-7AED-79EB-65E8A3A8064B; twe=2; xzfzqtoken=HQXI0TTk9WZoEbRIsTyBzfB9NK2frYrNrG5pZ1%2FeRDs4Qn3%2FgmY%2FWdnPyFuuP2j2in35brBb%2F%2FeSODvMgkQULA%3D%3D; wmda_session_id_6289197098934=1579222230577-99a50c37-d268-5a72'}
name = input('请输入地区:')#   加密数字解析,返回加密数字
def covert_secret_int(yuanma, base64_str):# base64解析转换成二进制  下载到本地ttf文件ttf = base64.decodebytes(base64_str.encode())#   BytesIO把一个二进制文件当成文件来操作zufangFont = TTFont(io.BytesIO(ttf))zufangFont.save('58zufang2.ttf')zufangFont.saveXML('58zufang2.xml')# print(zufangFont.keys())# 获取对应关系List = zufangFont['cmap'].tables[0].ttFont.getGlyphOrder()Listkey = zufangFont['cmap'].tables[0].ttFont.tables['cmap'].tables[0].cmap# print(List)# print(Listkey)Table = {}for key, value in Listkey.items():# print(hex(key))# Table[str(hex(key))[2:].lower()] = str(int(value.replace("glyph0000", "").replace("glyph000", ""))-1)Table[key] = str(int(value.replace("glyph0000", "").replace("glyph000", "")) - 1)# print("Table: ", Table)real_num = Table.get(yuanma)return real_num#将字符串中含有加密数字转换成正常数字并返回
def get_result(yuan_str, base64_str):yuanma = ""for y_index in range(len(yuan_str)):num = covert_secret_int(ord(yuan_str[y_index]), base64_str)if num is None:yuanma += yuan_str[y_index]else:yuanma += numreturn yuanma
def parse(url_):response = requests.get(url_,headers=headers)response.encoding='utf-8'return etree.HTML(response.text)
def parse_detail(list_url):selector = parse(list_url)time.sleep(random.randint(0,1))     #0~1秒爬取一次all_list = selector.xpath('//*[@class="zu-itemmod"]')       #当页中全部数据列表for sel in all_list:url_a = sel.xpath('div[1]/h3/a/@href')[0]       #获取到每一页的URLparse_id_detail(url_a)#爬取每一页中的详细内容
def parse_id_detail(url_a):alls = requests.get(url_a,headers=headers)alls.encoding='utf-8'selector = etree.HTML(alls.text)time.sleep(random.randint(0,1))     #0~1秒爬取一次# 匹配ttf fontcmp = re.findall(r";src:url\('(data.*)'\)\sformat\('truetype'\)", alls.text)# print("cmp:", cmp)try:    #   遇错时分析错误情况,程序继续运行base64_str = cmp[0][cmp[0].index('base64,') + 7:]# print(base64_str)items=[]item = {}# 房间价格price = selector.xpath('string(//*[@class="house-info-zufang cf"]/li[1]/span)')price = get_result(price,base64_str)    #调用上方函数解析# 房间类型type = selector.xpath('string(//*[@class="house-info-zufang cf"]/li[2]/span[2])')type = get_result(type,base64_str)  #调用上方函数解析# 面积大小mianji = selector.xpath('string(//*[@class="house-info-zufang cf"]/li[3]/span[2])')mianji = get_result(mianji,base64_str)  #调用上方函数解析# 房间朝向chaoxiang = selector.xpath('string(//*[@class="house-info-zufang cf"]/li[4]/span[2])')#  楼层height = selector.xpath('string(//*[@class="house-info-zufang cf"]/li[5]/span[2])')#   装修zhuangxiu = selector.xpath('string(//*[@class="house-info-zufang cf"]/li[6]/span[2])')#   类型leixing= selector.xpath('string(//*[@class="house-info-zufang cf"]/li[7]/span[2])')#   小区place= selector.xpath('string(//*[@class="house-info-zufang cf"]/li[8]/a)')places ='无锡'    #   页面中没有标明哪个市,那个憨批非要要没办法自己添一个哈哈,爬哪个市名字改一下就好哦#   所属地区diqu = selector.xpath('//*[@class="house-info-zufang cf"]/li[8]/a[2]/text()')[0]#   要求(男女不限)yaoqiu= selector.xpath('string(//*[@class="house-info-zufang cf"]/li[9]/span[2])')#   房间编号try:    #   因为有些房间数据缺失时会发生报错,给一个try遇到数据缺失使其等于空值‘’bianma= selector.xpath('//*[@class="right-info"]/span/text()')[0]except:bianma=''#   发布时间try:times= selector.xpath('//*[@class="right-info"]/b/text()')[0]except:times = ''times = get_result(times,base64_str)    #调用上方函数解析#放进item里面打包保存时有头名item['price']=priceitem['type']=typeitem['mianji'] = mianjiitem['chaoxiang'] = chaoxiangitem['height'] = heightitem['zhuangxiu'] = zhuangxiuitem['leixing'] = leixingitem['place'] = placeitem['places'] = placesitem['diqu'] = diquitem['yaoqiu'] = yaoqiuitem['bianma'] = bianmaitem['times'] = timesitems.append(item)#   将数据已json数据存储with open('all.json','a',encoding='utf-8')as fp:fp.write(json.dumps(item,ensure_ascii=False)+",\n")print(price,type,mianji,chaoxiang,height,zhuangxiu,leixing,place,places,diqu,yaoqiu,bianma,times)except Exception as e:print("异常原因:",e)  #输出出错情况
#   全部的URL放入列表中用for循环出全部的URL
url_lists = 'https://'+name+'.zu.anjuke.com/fangyuan/p'
all_url = [url_lists + str(i) for i in range(1,50)]
for url in all_url:parse_detail(url)

破解安居家数字加密成功爬取相关推荐

  1. python成功爬取拉勾网——初识反爬(一个小白真实的爬取路程,内容有点小多)

    python成功爬取拉勾网(一个小白的心里路程) 最开始想爬取拉钩是因为半年前上python实验课的时候,老师给了两个任务,一个时爬取糗百的笑话内容,另一个时爬取拉勾网的职位信息,当时因为课时紧张的缘 ...

  2. scrapy汽车之家车型的简单爬取

    汽车之家车型的简单爬取 spider # -*- coding: utf-8 -*- import scrapy from scrapy import Request from mininova.it ...

  3. 爬虫入门经典(二十一) | 破解CSS加密之爬取大众点评

      大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...

  4. python爬虫案例-乌托家家具公司数据爬取

    这个案例主要是在乌托家网站上爬取家具公司的数据,用的方法是requests模块和xpath语法.代码如下: 1 # Author:K 2 import requests 3 from lxml imp ...

  5. python爬虫之汽车之家论坛帖子内容爬取

    Datawhale爬虫 第五期 Day7 实战项目:汽车之家车型论坛帖子信息 作为国内目前第一大汽车论坛,反爬虫很恶心,中间很多坑. 新手,第一次搞这么复杂的爬虫,前期没有排查,都是遇到坑的时候再返回 ...

  6. JS+Selenium+excel追加写入,使用python成功爬取京东任何商品

    之前一直是requests库做爬虫,这次尝试下使用selenium做爬虫,效率不高,但是却没有限制,文章是分别结合大牛的selenium爬虫以及excel追加写入操作而成,还有待优化,打算爬取更多信息 ...

  7. 【Python爬虫学习】七、淘宝商品价格爬取(成功爬取)

    写在前面:修改request的headers属性,可以跳过登录界面,爬取成功 功能描述: 目标:获取淘宝搜索页面信息,提取其中商品的名称和价格 技术路线:Requests-Re 接口描述: 搜索接口: ...

  8. 爬虫实例:链家网房源数据爬取

    初接触python爬虫,跟着视频学习一些很基础的内容,小小尝试了一下,如有错误感谢指正. 库和方法介绍: (1)requests requests是python的工具包,用于发出请求,,是用来获取网站 ...

  9. python爬虫外贸客户_python实战成功爬取海外批发商价格信息并写入记事本

    运行平台:windows Python版本:Python 3.7.0 用到的第三方库:requests ,Beautiful Soup,re IDE:jupyter notebook 浏览器:Chro ...

最新文章

  1. mysql基础语句整理
  2. linux 设备树_嵌入式系统砖家_初识设备树
  3. 你的Java代码是否符合规范,来测测便知!
  4. c语言0x00如何不截断_binary 和 varbinary 用法全解
  5. 从键盘获取字符串,并把字符串转数字
  6. 工厂设计模式–一种有效的方法
  7. jq监听子元素被点击_vue开发app点击字母展示地区列表(兄弟组件之间联动)
  8. 富文本存储型XSS的模糊测试之道
  9. imp.load_source的用法
  10. CDialogBuilder 类
  11. Latex表格中内容过长换行方法
  12. VMRC开启拷贝粘贴
  13. 爬虫抓取百度文库中的文献
  14. 可视化大屏设计尺寸_数据可视化大屏设计尺寸怎么定?
  15. 社会工程学攻击案例-网站钓鱼
  16. IObit Uninstaller Pro v10.6.0.4 Cracked 安装监视器无法开启或无效的解决方案
  17. pytorch 中的torch.bmm
  18. activiti工作流研究——画流程图
  19. WIN7 旗舰版 只有“睡眠”没有“休眠”,要怎样添加“休眠”功能?
  20. 【Activiti7】什么是工作流?

热门文章

  1. [机缘参悟-28]:鬼谷子-内揵篇-保全自己,说服上司
  2. 计算机控制电缆灰色和蓝色,计算机电缆、控制电缆区别
  3. matlab中的标识符命名规则有哪些,关于标识符的命名规则,以下描述错误的是
  4. java 商品评价_java 商品评价计算算法
  5. 垃圾回收概述,算法及垃圾回收器
  6. html与jsp、jsp与jsp之间的交互
  7. 解决导出Excel表的时候,中文文件名出现乱码的问题
  8. JS之如何判断数据类型
  9. 日语(五十元音)_01
  10. 关于垂直线和水平线判断问题