您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

python爬取自如网房源信息

时间:2020-09-04 10:24:24  来源:  作者:

前言

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

作者: Star_Zhao

PS:如有需要Python/ target=_blank class=infotextkey>Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun

python爬取自如网房源信息

 

 

本次爬取自如网房源信息所用到的知识点:

  • requests get请求
  • lxml解析html
  • Xpath
  • MongoDB存储

正文

分析目标站点

  • url: http://hz.ziroom.com/z/nl/z3.html?p=2 的p参数控制分页
  • get请求

获取单页源码

# -*- coding: utf-8 -*-
import requests
import timefrom requests.exceptions import RequestException
def get_one_page(page):    try:
        url = "http://hz.ziroom.com/z/nl/z2.html?p=" + str(page)
        headers = {            'Referer':'http://hz.ziroom.com/',
            'Upgrade-Insecure-Requests':'1',
            'User-Agent':'Mozilla/5.0(windowsNT6.3;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36'
        }        res = requests.get(url,headers=headers)
        if res.status_code == 200:
            print(res.text)    except RequestException:        return None
def main():    page = 1
    get_one_page(page)if __name__ == '__main__':
    main()    time.sleep(1)

解析单页源码

  • 解析html文档, 目的: 测试XPath表达式

将获取的源码保存到当前文件夹下的"result.html"中, 然后通过XPath对其进行相应内容的提取, 当然你也可以使用某些在线工具.

from lxml import etree
#解析html文档html = etree.parse("./resul.html",etree.HTMLParser())results = html.xpath('//ul[@id="houseList"]/li')
for result in results[1:]:
    title = result.xpath("./div/h3/a/text()")[0][5:] if len(result.xpath("./div/h3/a/text()")[0]) >5 else ""
    location = result.xpath("./div/h4/a/text()")[0].replace("[","").replace("]",'')    area = " ".join(result.xpath("./div/div/p[1]/span/text()")).replace(" ","",1) #使用join方法将列表中的内容以" "字符连接    nearby = result.xpath("./div/div/p[2]/span/text()")[0]    print(title)    print(location)    print(area)    print(nearby)

解析源代码

from lxml import etree
def parse_one_page(sourcehtml):
    '''解析单页源码'''    contentTree = etree.HTML(sourcehtml)   #解析源代码    results = contentTree.xpath('//ul[@id="houseList"]/li') #利用XPath提取相应内容
    for result in results[1:]:
        title = result.xpath("./div/h3/a/text()")[0][5:] if len(result.xpath("./div/h3/a/text()")[0]) > 5 else ""
        location = result.xpath("./div/h4/a/text()")[0].replace("[", "").replace("]", '')        area = " ".join(result.xpath("./div/div/p[1]/span/text()")).replace(" ", "", 1)  # 使用join方法将列表中的内容以" "字符连接        nearby = result.xpath("./div/div/p[2]/span/text()")[0]        yield {        "title": title,        "location": location,        "area": area,        "nearby": nearby        }def main():    page = 1    html = get_one_page(page)
    print(type(html))    parse_one_page(html)
    for item in parse_one_page(html):
      print(item)if __name__ == '__main__':
    main()    time.sleep(1)

获取多个页面

def parse_one_page(sourcehtml):
    '''解析单页源码'''
    contentTree = etree.HTML(sourcehtml)   #解析源代码    results = contentTree.xpath('//ul[@id="houseList"]/li') #利用XPath提取相应内容
    for result in results[1:]:
        title = result.xpath("./div/h3/a/text()")[0][5:] if len(result.xpath("./div/h3/a/text()")[0]) > 5 else ""
        location = result.xpath("./div/h4/a/text()")[0].replace("[", "").replace("]", '')
        area = " ".join(result.xpath("./div/div/p[1]/span/text()")).replace(" ", "", 1)  # 使用join方法将列表中的内容以" "字符连接
        #nearby = result.xpath("./div/div/p[2]/span/text()")[0].strip()这里需要加判断, 改写为下句
        nearby = result.xpath("./div/div/p[2]/span/text()")[0].strip() if len(result.xpath("./div/div/p[2]/span/text()"))>0 else ""
        yield {
        "title": title,
        "location": location,
        "area": area,
        "nearby": nearby
        }        print(nearby)
    #yield {"pages":pages}
def get_pages():    """得到总页数"""
    page = 1
    html = get_one_page(page)    contentTree = etree.HTML(html)    pages = int(contentTree.xpath('//div[@class="pages"]/span[2]/text()')[0].strip("共页"))
    return pages
def main():    pages = get_pages()    print(pages)
    for page in range(1,pages+1):
        html = get_one_page(page)        for item in parse_one_page(html):
            print(item)
if __name__ == '__main__':
    main()    time.sleep(1)

存储到MongoDB中

需确保MongoDB已启动服务, 否则必然会存储失败

def save_to_mongodb(result):
    """存储到MongoDB中"""
    # 创建数据库连接对象, 即连接到本地
    client = pymongo.MongoClient(host="localhost")
    # 指定数据库,这里指定ziroom
    db = client.iroomz
    # 指定表的名称, 这里指定roominfo
    db_table = db.roominfo
    try:
        #存储到数据库
        if db_table.insert(result):
            print("---存储到数据库成功---",result)
    except Exception:
        print("---存储到数据库失败---",result)

完整代码

1 # -*- coding: utf-8 -*-
 2 
 3 import requests
 4 import time
 5 import pymongo
 6 from lxml import etree
 7 from requests.exceptions import RequestException
 8 def get_one_page(page):
 9     '''获取单页源码'''
10     try:
11         url = "http://hz.ziroom.com/z/nl/z2.html?p=" + str(page)
12         headers = {
13             'Referer':'http://hz.ziroom.com/',
14             'Upgrade-Insecure-Requests':'1',
15             'User-Agent':'Mozilla/5.0(WindowsNT6.3;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36'
16         }
17         res = requests.get(url,headers=headers)
18         if res.status_code == 200:
19             return res.text
20         return None
21     except RequestException:22         return None
23 def parse_one_page(sourcehtml):24     '''解析单页源码'''
25     contentTree = etree.HTML(sourcehtml)   #解析源代码
26     results = contentTree.xpath('//ul[@id="houseList"]/li') #利用XPath提取相应内容
27     for result in results[1:]:
28         title = result.xpath("./div/h3/a/text()")[0][5:] if len(result.xpath("./div/h3/a/text()")[0]) > 5 else ""
29         location = result.xpath("./div/h4/a/text()")[0].replace("[", "").replace("]", '')
30         area = " ".join(result.xpath("./div/div/p[1]/span/text()")).replace(" ", "", 1)  # 使用join方法将列表中的内容以" "字符连接
31         #nearby = result.xpath("./div/div/p[2]/span/text()")[0].strip()这里需要加判断, 改写为下句
32         nearby = result.xpath("./div/div/p[2]/span/text()")[0].strip() if len(result.xpath("./div/div/p[2]/span/text()"))>0 else ""
33         data = {
34         "title": title,
35         "location": location,
36         "area": area,
37         "nearby": nearby
38         }39         save_to_mongodb(data)
40     #yield {"pages":pages}
41 def get_pages():
42     """得到总页数"""
43     page = 1
44     html = get_one_page(page)
45     contentTree = etree.HTML(html)
46     pages = int(contentTree.xpath('//div[@class="pages"]/span[2]/text()')[0].strip("共页"))
47     return pages
48 def save_to_mongodb(result):49     """存储到MongoDB中"""
50     # 创建数据库连接对象, 即连接到本地
51     client = pymongo.MongoClient(host="localhost")
52     # 指定数据库,这里指定ziroom
53     db = client.iroomz54     # 指定表的名称, 这里指定roominfo55     db_table = db.roominfo56     try:57         #存储到数据库
58         if db_table.insert(result):
59             print("---存储到数据库成功---",result)
60     except Exception:
61         print("---存储到数据库失败---",result)
62 
63 def main():
64     pages = get_pages()
65     print(pages)
66     for page in range(1,pages+1):
67         html = get_one_page(page)
68         parse_one_page(html)
69 
70 if __name__ == '__main__':
71     main()
72     time.sleep(1)

最终结果

python爬取自如网房源信息

 

总结

在第三步中XPath使用注意事项

title = result.xpath("./div/h3/a/text()")
此处的点'.'不能忘记, 它表示当前节点, 如果不加'.', '/'就表示从根节点开始选取

在第四步获取多个页面时出现索引超出范围错误

nearby = result.xpath("./div/div/p[2]/span/text()")[0].strip()
IndexError: list index out of range

造成这种错误原因有两种:

  1. [index] index超出list范围
  2. [index] index索引内容为空

因为这里的nearby的index是0, 排除第一种情况, 那么这里就是空行了, 加句if判断就可以解决

nearby = result.xpath("./div/div/p[2]/span/text()")[0].strip()
#改写以后:nearby = result.xpath("./div/div/p[2]/span/text()")[0].strip() if len(result.xpath("./div/div/p[2]/span/text()"))>0 else ""

以上主要是对爬虫过程学习的总结, 若有不对的地方, 还请指正, 谢谢!



Tags:python爬取   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今天讲解如何用python爬取芒果TV、腾讯视频、B站、爱奇艺、知乎、微博这几个常见常用的影视、舆论平台的弹幕和评论,这类爬虫得到的结果一般用于娱乐、舆情分析,如:新出一部火...【详细内容】
2021-11-15  Tags: python爬取  点击:(336)  评论:(0)  加入收藏
1.前言爬取视频的时候发现,现在的视频都是经过加密(m3u8),不再是mp4或者avi链接直接在网页显示,都是经过加密形成ts文件分段进行播放。今天就教大家如果通过python爬取下载m3u8加...【详细内容】
2021-03-11  Tags: python爬取  点击:(814)  评论:(0)  加入收藏
记录一下如何用python爬取app数据,本文以爬取抖音视频app为例。编程工具:pycharmapp抓包工具:mitmproxyapp自动化工具:appium运行环境:windows10思路:私信小编01即可获取大量Pytho...【详细内容】
2020-12-02  Tags: python爬取  点击:(93)  评论:(0)  加入收藏
众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕。不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列。通过分析弹幕,我们...【详细内容】
2020-10-09  Tags: python爬取  点击:(119)  评论:(0)  加入收藏
前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者: Star_ZhaoPS:如有需要Python学习资料的小...【详细内容】
2020-09-04  Tags: python爬取  点击:(64)  评论:(0)  加入收藏
GEO数据库是NCBI创建并维护的基因表达数据库,始于2000年,收录了世界各国研究机构提交的高通量基因表达数据,现芯片集数据量高达12万以上。想要从这里面挖掘(bai piao)数据,发个sci...【详细内容】
2020-05-15  Tags: python爬取  点击:(144)  评论:(0)  加入收藏
最近加入了斗图群,发现自己的表情包太少了,斗不过他们。今天用python实现批量抓取百度图片里面的表情包和他们决战。需要实现的效果图: 目标 获取百度图片的URL,并且下载到本...【详细内容】
2020-04-11  Tags: python爬取  点击:(49)  评论:(0)  加入收藏
本教程完全基于Python3版本,主要使用Chrome浏览器调试网页、Scrapy框架爬取数据、MongoDB数据库存储数据,选择这个组合的理由是成熟、稳定、快速、通行,此外可能会涉及Requests+BeautifulSoup解析、Redis数据库、Djiango...【详细内容】
2019-11-11  Tags: python爬取  点击:(187)  评论:(0)  加入收藏
继续老套路,这两天我爬取了猪八戒上的一些数据 网址是:http://task.zbj.com/t-ppsj/p1s5.html,可能是由于爬取的数据量有点多吧,结果我的IP被封了,需要自己手动来验证解封ip,但这...【详细内容】
2019-10-29  Tags: python爬取  点击:(169)  评论:(0)  加入收藏
#本代码作用:爬取贴吧的页面信息'''观察发现在百度贴吧搜索python时:1、百度贴吧第1页网址:http://tieba.baidu.com/f?ie=utf-8&kw=python&fr=search&red_tag=p010...【详细内容】
2019-10-18  Tags: python爬取  点击:(272)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条