欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Python 抓取链家海量二手房信息并打包成 exe 软件

最编程 2024-06-03 17:23:00
...

推荐一下我建的python学习交流qun:850973621,群里有免费的视频教程,开发工具、 电子书籍、项目源码分享。一起交流学习,一起进步! QQ截图20201214142838.png

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

基本开发环境

  • Python 3.6

  • Pycharm

相关模块使用

import requestsimport parselimport csvimport concurrent.futuresimport urllib

目标网页分析

图片

点击二手房,即可进入。

图片

看到这价格,只想说一句,真特么贵

列表页

图片

详情页

图片

网页是静态数据,请求url即可获取网页源代码,然后再解析数据即可,难度不大

图片

获取数据内容:

  • 总售价,

  • 单价,

  • 建筑面积,

  • 所在楼层,

  • 房屋朝向,

  • 房屋户型,

  • 装修情况,

  • 配备电梯,

  • 建筑结构,

  • 小区名称,

  • 交易权属,

  • 房租用途

运行效果图

图片

图片

需要注意的点:

图片

其实链接地址是

'https://bj.lianjia.com/ershoufang/rs%E7%8F%A0%E6%B1%9F%E7%BD%97%E9%A9%AC%E5%98%89%E5%9B%AD%E8%A5%BF%E5%8C%BA/'
  • 需要输入搜索内容需要转码

这个为例:

图片

如何打包成exe软件:

1、 在cmd命令行中安装 pyinstaller 模块 pip install pyinstaller

(windows键 + R 输入cmd 即可)

图片

图片

我这里已经是安装好的

2、打包exe ,命令 pyinstall -F xxxx.py (文件名)

  • 同样在cmd当中,先cd选择到py文件所在的路径 输入命令即可打包。

  • 在文件所在文件夹中,按住shift + 鼠标右键,选择 在此处打开Powershell窗口,进入之后输入相关命令。

为了方便我选择第二种。

图片

图片

图片

图片

这样就打包成功了,关于打包exe 还有很多其他的内容,这里就不详聊了。

3、exe运行效果

图片

输入想要爬取的城市、小区以及需要爬取多少页数据。

当爬取完成之后可以选择是否继续爬取。

4、可完善的地方。

  • 界面太丑了,可以选择自己写一个GUI界面。可使用TK 或者 QT

  • 可以分区域爬取,小区毕竟太少了,可以按照每个城市的区域去划分

  • 暂时没想到,欢迎大家留言讨论

相关代码 #给你代码只会复制粘贴运行,没有任何实际意义

  • 获取网页源代码以及解析
def get_response(html_url):    response = requests.get(url=html_url, headers=headers).text    return responsedef get_parsing(html_data):    selector = parsel.Selector(html_data)    return selector
  • 获取每个房源信息url
def get_page_url(page_url):    html_data = get_response(page_url)    selector = get_parsing(html_data)    page_url = selector.css('.sellListContent li .title a::attr(href)').getall()    return page_url
  • 解析网页获取相关数据
def main(url):    lis = get_page_url(url)    for li in lis:        html_data = get_response(li)        selector = get_parsing(html_data)        title = selector.css('.main::attr(title)').get()  # 标题        all_price = selector.css('div.price .total::text').get() + '万'  # 总价        one_price = selector.css('div.price .unitPriceValue::text').get() + '/平米'  # 单价        area = selector.css('div.area .mainInfo::text').get()  # 房屋面积        floor = selector.css('#introduction .base .content ul li:nth-child(2)::text').get()  # 房屋楼层        face = selector.css('#introduction .base .content ul li:nth-child(7)::text').get()  # 房屋朝向        unit_type = selector.css('#introduction .base .content ul li:nth-child(1)::text').get()  # 房屋户型        decoration = selector.css('#introduction .base .content ul li:nth-child(9)::text').get()  # 房屋装修        elevator = selector.css('#introduction .base .content ul li:nth-child(11)::text').get()  # 电梯        building = selector.css('#introduction .base .content ul li:nth-child(8)::text').get()  # 建筑结构        ownership = selector.css(            '#introduction .transaction .content ul li:nth-child(2) span:nth-child(2)::text').get()  # 交易权属        use = selector.css(            '#introduction .transaction .content ul li:nth-child(4) span:nth-child(2)::text').get()  # 房屋用途        community = selector.css('.aroundInfo .communityName .info::text').get()  # 小区名称        dit = {            '总价': all_price,            '单价': one_price,            '面积': area,            '楼层': floor,            '朝向': face,            '户型': unit_type,            '装修': decoration,            '电梯': elevator,            '建筑结构': building,            '交易权属': ownership,            '房屋用途': use,            '小区名称': community,            '详情页地址': li,        }        csv_writer.writerow(dit)        print(dit)
if __name__ == '__main__':    while True:        city_word = input('请输入你要搜索的城市名字(如:北京,bj):')        key_word = input('请输入你要搜索的小区名字:')        key_page = int(input('请输入你要爬取多少页数据:'))        f = open('{}{}.csv'.format(city_word, key_word), mode='a', encoding='utf-8-sig', newline='')        csv_writer = csv.DictWriter(f,                                    fieldnames=['总价', '单价', '面积', '楼层', '朝向', '户型', '装修', '电梯', '建筑结构', '交易权属', '房屋用途',                                                '小区名称', '详情页地址'])        csv_writer.writeheader()        executor = concurrent.futures.ThreadPoolExecutor(max_workers=10)        for page in range(1, key_page + 1):            url = 'https://{}.lianjia.com/ershoufang/pg{}rs{}/'.format(city_word, page, key_word)            executor.submit(main, url)        executor.shutdown()        a = input('是否选择继续爬取(Yes or No):')        if a == 'Yes':            continue        else:            break

代码会有报错,特意留的~

#给你代码只会复制粘贴运行,没有任何实际意义