人生苦短,我用 Pythonhtml
前文传送门:python
小白学 Python 爬虫(2):前置准备(一)基本类库的安装github
小白学 Python 爬虫(3):前置准备(二)Linux基础入门sql
小白学 Python 爬虫(4):前置准备(三)Docker基础入门数据库
小白学 Python 爬虫(5):前置准备(四)数据库基础app
小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装框架
小白学 Python 爬虫(10):Session 和 Cookies
小白学 Python 爬虫(11):urllib 基础使用(一)
小白学 Python 爬虫(12):urllib 基础使用(二)
小白学 Python 爬虫(13):urllib 基础使用(三)
小白学 Python 爬虫(14):urllib 基础使用(四)
小白学 Python 爬虫(15):urllib 基础使用(五)
小白学 Python 爬虫(16):urllib 实战之爬取妹子图
小白学 Python 爬虫(17):Requests 基础使用
小白学 Python 爬虫(18):Requests 进阶操做
小白学 Python 爬虫(21):解析库 Beautiful Soup(上)
小白学 Python 爬虫(22):解析库 Beautiful Soup(下)
小白学 Python 爬虫(23):解析库 pyquery 入门
看到题目确定有同窗会问,为啥不包含新房,emmmmmmmmmmm
说出来都是血泪史啊。。。
小编已经哭晕在厕所,那位同窗赶忙醒醒,太阳还没下山呢。
别看不起二手房,说的好像你们都买得起同样。
淡很少扯,先进入正题,目标页面的连接小编已经找好了:https://sh.lianjia.com/ershoufang/pg1/ 。
房源数量仍是蛮多的么,今年正题房产行业不景气,听说 房价都不高。
小编实际上是有目的的,毕竟也来上海五年多了,万一真的爬出来的数据看到有合适,对吧,顺便也能帮你们探个路。
首先仍是分析页面的连接信息,其实已经很明显了,在连接最后一栏有一个 pg1
,小编猜应该是 page1
的意思,不信换成 pg2
试试看,很显然的么。
随便打开一个房屋页面进到内层页面,看下数据:
数据仍是很全面的嘛,那详细数据就从这里取了。
顺便再看下详情页的连接:https://sh.lianjia.com/ershoufang/107102012982.html 。
这个编号从哪里来?
小编敢保证在外层列表页的 DOM 结构里确定能找到。
这就叫老司机的直觉,秀不秀就完了。
思想仍是老思想,先将外层列表页的数据构建一个列表,而后经过循环那个列表爬取详情页,将获取到的数据写入 Mysql 中。
本篇所使用到的请求库和解析库仍是 Requests 和 pyquery 。
别问为啥,问就是小编喜欢。
由于简单。
仍是先定义一个爬取外层房源列表的方法:
def get_outer_list(maxNum): list = [] for i in range(1, maxNum + 1): url = 'https://sh.lianjia.com/ershoufang/pg' + str(i) print('正在爬取的连接为: %s' %url) response = requests.get(url, headers=headers) print('正在获取第 %d 页房源' % i) doc = PyQuery(response.text) num = 0 for item in doc('.sellListContent li').items(): num += 1 list.append(item.attr('data-lj_action_housedel_id')) print('当前页面房源共 %d 套' %num) return list
这里先获取房源的那个 id
编号列表,方便咱们下一步进行链接的拼接,这里的传入参数是最大页数,只要不超过实际页数便可,目前最大页数是 100 页,这里最大也只能传入 100 。
房源列表获取到之后,接着就是要获取房源的详细信息,此次的信息量有点大,解析起来稍有费劲儿:
def get_inner_info(list): for i in list: try: response = requests.get('https://sh.lianjia.com/ershoufang/' + str(i) + '.html', headers=headers) doc = PyQuery(response.text) # 基本属性解析 base_li_item = doc('.base .content ul li').remove('.label').items() base_li_list = [] for item in base_li_item: base_li_list.append(item.text()) # 交易属性解析 transaction_li_item = doc('.transaction .content ul li').items() transaction_li_list = [] for item in transaction_li_item: transaction_li_list.append(item.children().not_('.label').text()) insert_data = { "id": i, "danjia": doc('.unitPriceValue').remove('i').text(), "zongjia": doc('.price .total').text() + '万', "quyu": doc('.areaName .info').text(), "xiaoqu": doc('.communityName .info').text(), "huxing": base_li_list[0], "louceng": base_li_list[1], "jianmian": base_li_list[2], "jiegou": base_li_list[3], "taoneimianji": base_li_list[4], "jianzhuleixing": base_li_list[5], "chaoxiang": base_li_list[6], "jianzhujiegou": base_li_list[7], "zhuangxiu": base_li_list[8], "tihubili": base_li_list[9], "dianti": base_li_list[10], "chanquan": base_li_list[11], "guapaishijian": transaction_li_list[0], "jiaoyiquanshu": transaction_li_list[1], "shangcijiaoyi": transaction_li_list[2], "fangwuyongtu": transaction_li_list[3], "fangwunianxian": transaction_li_list[4], "chanquansuoshu": transaction_li_list[5], "diyaxinxi": transaction_li_list[6] } cursor.execute(sql_insert, insert_data) conn.commit() print(i, ':写入完成') except: print(i, ':写入异常') continue
两个最关键的方法已经写完了,接下来看下小编的成果:
这个价格看的小编血压有点高。
果真仍是我大魔都,无论几手房,价格看看就好。
从结果能够看出来,链家虽然是说的有 6W 多套房子,实际上咱们从页面上能够爬取到的拢共也就只有 3000 套,远没有达到咱们想要的全部的数据。可是小编增长筛选条件,房源总数确实也是会变更的,应该是作了强限制,最多只能展现 100 页的数据,防止数据被彻底爬走。
套路仍是很深的,只要不把数据放出来,泥萌就不要想能爬到个人数据。对于通常用户而言,能看到前面的一些数据也足够了,估计也没几我的会翻到最后几页去看数据。
本篇的代码就到这里了,若是有须要获取所有代码的,能够访问代码仓库获取。
本系列的全部代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便你们取用。
原文出处:https://www.cnblogs.com/babycomeon/p/12094742.html