爬取自如租房信息
最近正在学习python爬虫,顺便又要租房子,于是就想爬去自如上的租房信息顺便来联系一下。
·掉进价格的大坑里
在爬取过程中一切都听顺利的,可是到了最关键的房租部分就遇到了问题。居然是一张图片,每次加载一个随机顺序数字的图片,之后从这张图片根据像素截取出来数字之后显示价格。
在找到随机生成的图片后发现后面跟着一串列表,这些数字对应着真实的价格。
生成的随机图片长这样。。。
之后就跑去翻了很多大佬的文章,发现大家都遇到了这个坑。而且很多人也提供了自己的解决思路,但是大部分是要调用图片转文字的API。对于我这个菜鸟来说,听着就觉得很麻烦(调用免费API的使用次数少的可怜)。
·寻找出路
为了愉快的解决现在的问题,我决定自己想一想别的出路。前一段时间有点沉迷基于CNN的图片分类,自己慢慢照着大神的代码写了一个皮卡丘和妙蛙种子的分类器,结果直到现在还没有解决过拟合的问题。不过这个坑先放在一边,将图片输入CNN时,是将图片转换成一个numpy
的数组,然后再进行分类训练。既然这样,就可以将每个数字的数组都记录下来,之后再合爬去网页中新生成的图片对比,得到图片的随机数列,之后再根据之前找到的列表来确定每间房子的价格(我这只弱鸡总是喜欢想一些复杂的方法呀哈哈 )。
这是我随便找来的一张图片,保存在本地作为标准。
测试图片就用刚才的那一张图。
不废话直接上代码。。。
from PIL import Image
import numpy as np
import requests as req
from io import BytesIO
def read_image(imageName):
im = Image.open(imageName).convert('RGB')
data = np.array(im)
return data
def read_image_url(img_url):
response = req.get('http://'+img_url)
im = Image.open(BytesIO(response.content)).convert('RGB')
data = np.array(im)
return data
def get_num(n):
l_num = []
m = 0
x = n
while True:
if m < 9:
x0,x1, = np.split(x, [30],axis = 1)
l_num.append(x0)
x = x1
m+=1
continue
else:
l_num.append(x)
break
return l_num
def get_0_9():
l_num = get_num(read_image('test001.png'))
x2,x4,x3,x6,x8,x5,x1,x9,x0,x7 = l_num
list_num = [x0,x1,x2,x3,x4,x5,x6,x7,x8,x9]
return list_num
def get_num_list(png):
l = []
list_num = get_0_9()
l_num_test = get_num(read_image_url(png))
for i in range(0,10):
for w in range(0,10):
if (l_num_test[i] == list_num[w]).all():
l.append(w)
#print(w)
break
#print (l)
return l
·之后的工作
这样就得到了随机生成图片的数字列表,在根据之前的得到的,图片中索引的列表,就可以知道每间房子的租金了。
这是最终的成果。。。