东莞seo建站优化收费,网站建设和维护的职责,wordpress底部浮动窗口,做像百姓网这样网站多少钱前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于啤酒就辣条 #xff0c;作者啤酒就辣条一、网页分析爬取贝壳网石家庄二手房信息#xff0c;先打开链接https://sjz.ke.com/ershoufang…前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于啤酒就辣条 作者啤酒就辣条一、网页分析爬取贝壳网石家庄二手房信息先打开链接https://sjz.ke.com/ershoufang/。不添加筛选条件发现总共有42817套房子。我们点击第二页再查看链接变成了https://sjz.ke.com/ershoufang/pg2/。所以可发现/pg{i}i就是页码。所以最多可爬取3000套房产信息距离上面给出的4万多差的还很远于是尝试把pg{i}的那个i人为改变一下点击回车请求一下。返回房产信息数据都一样。都是第100页的信息于是乎得出结论。通过贝壳网web端查看某一条件下的房产信息最多可以查看3000套。所以呢我们增加一些条件比如满五唯一2室的。请求之~发现链接变成了https://sjz.ke.com/ershoufang/pg2mw1l2/。mw1l2这个玩意应该筛选条件。看到只有2399套欧克咱们就爬它了。二、撸起袖子写代码麻雀虽小五脏俱全本爬虫设计三个部分爬取解析储存。爬取爬取利用requests库比python内置库urllib要好用很多。importrequestsdefget_a_page(url):resultrequests.get(url)print(result.text)if __name__ __main__:for i in range(1, 101):get_a_page(fhttps://sjz.ke.com/ershoufang/pg{i}mw1l2/)for循环打印返回数据发现没问题。其实i循环到81就好了毕竟咱们知道了只有不到2400套嘛。解析解析使用pyquery 这个库使用起来类似于Jquery。完整APIhttps://pythonhosted.org/pyquery/api.html。还有一个解析库bs4下次再尝试。在这里插入图片描述发现读取如图所示ul里面一个div就可以拿到我们想要的数据。importrequestsfrom pyquery importPyQuery as pqimportjsondefget_a_page(url):resultrequests.get(url)docpq(result.text)ul doc(.sellListContent)divs ul.children(.clear .info.clear).items()for div indivs:count 1title div.children(.title a).text()place div.children(.address .flood .positionInfo a).text()msg div.children(.address .houseInfo).text()price div.children(.address .priceInfo .totalPrice span).text()per_meter div.children(.address .priceInfo .unitPrice).attr(data-price)dict{title: title,place: place,msg: msg,price: price,per_meter: per_meter}print(str(count) : json.dumps(dict, ensure_asciiFalse))代码如上pyquery 的children方法是查找子标签find方法是找子孙标签此处我们只需要找下一代就好。然后通过text找到标签所包含的文本。attr是获取属性内容的因为那个per_meter从属性中获取比较简单标签中的内容还包含了“元/平米”。储存本次我们直接储存到csv中一种类似于excel的文件格式。利用的是pandas库。完整代码如下importrequestsfrom pyquery importPyQuery as pqimportjsonimportpandas as pdcolumns [title, msg, price, per_meter]#爬取某网页defget_a_page(url):resultrequests.get(url)docpq(result.text)ul doc(.sellListContent)divs ul.children(.clear .info.clear).items()count0titles[]places[]msgs[]prices[]per_meters[]for div indivs:count 1title div.children(.title a).text()place div.children(.address .flood .positionInfo a).text()msg div.children(.address .houseInfo).text()price div.children(.address .priceInfo .totalPrice span).text()per_meter div.children(.address .priceInfo .unitPrice).attr(data-price)dict{title: title,place: place,msg: msg,price: price,per_meter: per_meter}titles.append(title)places.append(place)msgs.append(msg)prices.append(price)per_meters.append(per_meter)print(str(count) : json.dumps(dict, ensure_asciiFalse))datas{title: titles,place: places,msg: msgs,price: prices,per_meter: per_meters}df pd.DataFrame(datadatas, columnscolumns)df.to_csv(sjz.csv, modea, indexFalse, headerFalse)if __name__ __main__:for i in range(1, 101):get_a_page(fhttps://sjz.ke.com/ershoufang/pg{i}mw1l2/)多进程由于get_a_page函数要运行100次有点小慢所以利用多进程加快速度这部分代码请直接copy。将主函数改成如下所示from multiprocessing.pool importPoolif __name__ __main__:pool Pool(5)group ([fhttps://sjz.ke.com/ershoufang/pg{x}mw1l2/for x in range(1, 101)])pool.map(get_a_page,group)pool.close()pool.join()三、结束查看下效果效果还可以。有人会说为什么不把msg信息拆分一下分别储存楼层、几室几厅、建筑年代等等多好。刚开始我是那么做的结果发现这个msg数据那几项不是必填项有的建筑年代、楼层什么的房主不填写索性就整个拿过来了。