Advertisement

xpath爬取链家二手房

阅读量:
复制代码
    import requests
    from lxml import etree
    from fake_useragent import UserAgent
    import random
    import time
    
    class LianjiaSpider(object):
    def __init__(self):
        self.url='https://nc.lianjia.com/ershoufang/pg{}/'
    
    #功能函数:随机获取User-Agent
    def get_headers(self):
        ua=UserAgent()#创建UserAgent对象
        headers={ "User-Agent": ua.random}#随机获取请求头
        return headers
    
    #获取页面
    def get_html(self,url):
        #设置超时时间为5秒,尝试次数为3次
        for i in range(3):
            try:
                res = requests.get(url=url, headers=self.get_headers(),timeout=5)
                res.encoding = "utf-8"
                html = res.text
                return html
            except Exception as e:
                print("Failed ,Retry:",i)
                continue
    
    #解析页面
    def parse_html(self,url):
        html=self.get_html(url)
        #html返回值有两种:1:html 2:None
        if html:
            parse_obj = etree.HTML(html)  # 解析对象
            # 基准xpath,li节点列表
            li_list = parse_obj.xpath('//ul[@class="sellListContent"]/li[@class="clear LOGVIEWDATA LOGCLICKDATA"]')
            # for循环遍历每个li节点,获取一个房源的所有数据
            item = {}
            for li in li_list:
                # 名称
                item["name"] = li.xpath('.//a[@data-el="region"]/text()')[0].strip()
                # 户型+面积+方位+精装+楼层+楼型
                # info_list:['3室2厅','110平米','南 北','毛坯','中楼层(共19层)','板楼']
                info_list = li.xpath('.//div[@class="houseInfo"]/text()')[0].split('|')
                item["model"] = info_list[0].strip()
                item["area"] = info_list[1].strip()[:-2]
                item["direction"] = info_list[2].strip()
                item["perfect"] = info_list[3].strip()
                item["floor"] = info_list[4].strip()
                # 地区+总价+单价
                item["address"] = li.xpath('.//div[@class="positionInfo"]/a/text()')[1].strip()
                item["totall"] = li.xpath('.//div[@class="totalPrice"]/span/text()')[0].strip()
                item["unit"] = li.xpath('.//div[@class="unitPrice"]/span/text()')[0].strip()[2:-4]
                print(item)
    
    #入口函数
    def run(self):
        for page in range(1,3):
            url=self.url.format(page)
            self.parse_html(url)
            time.sleep(random.uniform(1,3))#产生随机浮点数休眠
    
    if __name__ == '__main__':
    spider=LianjiaSpider()
    spider.run()

全部评论 (0)

还没有任何评论哟~