一、分析

  1. 1、爬取网页中的租金发现,数字是由数字背景图片中的偏移量对应的数值
  2. 2、获取源码
  3. 3、保存图片
  4. 4、解析图片中的数字
  5. 5、通过计算得到每一位数字对应的偏移量所组成的字典类型数据
  6. 一个位置的偏移量是21.4,具体数字的位置为:
  7. x_list = ['-0px', '-21.4px', '-42.8px', '-64.2px', '-85.6px',
  8. '-107px', '-128.4px', '-149.8px', '-171.2px','-192.6px']
  9. 6、获取网页源码中价格对应的偏移量来进行替换成对应的数字

二、程序实现

  1. import pytesseract
  2. import requests
  3. from lxml import etree
  4. import re
  5. from urllib import request
  6. class ZiRoom():
  7. # 获取网页源码和保存数字背景图片
  8. def get_html_img(self):
  9. url = 'https://www.ziroom.com/z/'
  10. header = {
  11. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
  12. }
  13. res = requests.get(url, headers=header).text
  14. # 先用xpath初步定位到url的位置
  15. html = etree.HTML(res)
  16. back_img_info = html.xpath('//span[@class="num"]/@style')[0]
  17. # https://static8.ziroom.com/phoenix/pc/images/price/new-list/dff9d441e1fc59f793d5c3b68461b3ea.png
  18. # 再用正则具体匹配
  19. back_img_url = 'https:' + re.search(r'url\((.*?)\)', back_img_info).group(1)
  20. request.urlretrieve(back_img_url, 'back_img_url.png') # 保存图片
  21. # 返回源码
  22. return html
  23. # 解析标题和价格
  24. def repalce_data(self, res, replace_dict):
  25. div_list = res.xpath('//div[@class="Z_list-box"]/div[@class="item"]')
  26. for div in div_list:
  27. title = div.xpath('.//h5[contains(@class, "title")]/a/text()')[0]
  28. print("房源:",title)
  29. # 获取价格
  30. style_list = div.xpath('.//div[@class="price "]/span[@class="num"]/@style')
  31. # 用拼接字符串的方式得到最终价格
  32. price = ''
  33. for style in style_list:
  34. position = style.split(': ')[-1]
  35. price = price + replace_dict[position]
  36. print("月租:",price)
  37. def main(self):
  38. res = self.get_html_img()
  39. # 识别图片中的数字
  40. number_str = pytesseract.image_to_string("./back_img_url.png")
  41. # num_list = [6, 9, 4, 8, 5......]
  42. # 真实数字列表
  43. number_list = re.findall('\d', number_str)
  44. # 偏移量列表
  45. x_list = ['-0px', '-21.4px', '-42.8px', '-64.2px', '-85.6px', '-107px', '-128.4px', '-149.8px', '-171.2px','-192.6px']
  46. # ['6', '2', '9', '1', '0', '7', '8', '4', '5', '3']
  47. # replace_dict 有替换关系的字典
  48. replace_dict = dict(zip(x_list, number_list))
  49. # {'-0px': '8', '-21.4px': '6', '-42.8px': '7', '-64.2px': '0', '-85.6px': '4', '-107px': '1', '-128.4px': '5', '-149.8px': '9', '-171.2px': '2', '-192.6px': '3'}
  50. self.repalce_data(res, replace_dict)
  51. if __name__ == '__main__':
  52. room = ZiRoom()
  53. room.main()
  1. 图片地址:https://static8.ziroom.com/phoenix/pc/images/price/new-list/48d4fa3aa7adf78a1feee05d78f33700.png
  2. 房源: 合租·鸿顺园东区5居室-南卧
  3. 月租: 1760
  4. 房源: 城市之光丽泽店·一居博学
  5. 月租: 2699
  6. 房源: 整租·运河明珠2居室-南
  7. 月租: 5460
  8. 房源: 合租·首开熙悦睿府书香4居室-南卧
  9. 月租: 1830
  10. 房源: 合租·金汉绿港三区4居室-南卧
  11. 月租: 2090
  12. 房源: 合租·西辛南区3居室-南卧
  13. 月租: 2360
  14. 房源: 合租·东兴一区3居室-南卧
  15. 月租: 2260
  16. 房源: 合租·碧波园3居室-南卧
  17. 月租: 1890
  18. 房源: 整租·紫运南里一区2居室-南
  19. 月租: 5530
  20. 房源: 合租·幸福西区3居室-南卧
  21. 月租: 2030
  22. 房源: 合租·建邦华庭东区3居室-南卧
  23. 月租: 2460
  24. 房源: 合租·煤炭公司家属楼3居室-南卧
  25. 月租: 2390
  26. 房源: 合租·首创紫悦台4居室-南卧
  27. 月租: 2490
  28. 房源: 合租·前进花园牡丹苑3居室-南卧
  29. 月租: 2460
  30. 房源: 合租·鸿顺园东区3居室-南卧
  31. 月租: 1790
  32. 房源: 合租·天时名苑4居室-南卧
  33. 月租: 2760
  34. 房源: 合租·稻田回迁楼北区3居室-南卧
  35. 月租: 2290
  36. 房源: 合租·清源西里3居室-南卧
  37. 月租: 2430
  38. 房源: 合租·碧波园3居室-南卧
  39. 月租: 2160
  40. 房源: 合租·前进花园石门苑3居室-南卧
  41. 月租: 2330
  42. 房源: 合租·中国铁建青秀尚城3居室-南卧
  43. 月租: 2460
  44. 房源: 合租·保利春天里5居室-南卧
  45. 月租: 2360
  46. 房源: 合租·路劲世界城二期3居室-南卧
  47. 月租: 2390
  48. 房源: 整租·新光大中心1居室-北
  49. 月租: 6930
  50. 房源: 合租·幸福西区3居室-南卧
  51. 月租: 2260
  52. 房源: 合租·芭蕾雨悦都南区3居室-南卧
  53. 月租: 2360
  54. 房源: 合租·车站北里3居室-南卧
  55. 月租: 2860
  56. 房源: 合租·世纪东方城4居室-南卧
  57. 月租: 3160
  58. 房源: 合租·龙跃苑三区6居室-南卧
  59. 月租: 2990