链家二手房案例(xpath)

本文详细介绍了爬虫技术中的关键技巧,包括User-Agent反爬、响应内容处理、请求与解析模块使用、XPath表达式匹配及多级页面数据抓取。通过实例展示了如何使用Python的requests和lxml库抓取链家网的二手房信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于User-Agent反爬

1、发送请求携带请求头: headers={'User-Agent' : 'Mozilla/5.0 xxxxxx'}
2、多个请求随机切换User-Agent
   1、定义列表存放大量User-Agent,使用random.choice()每次随机选择
   2、定义py文件存放大量User-Agent,使用random.choice()每次随机选择
   3、使用fake_useragent模块每次访问随机生成User-Agent
    # sudo pip3 install fake_useraget
    
    * from fake_useragent import UserAgent
    * ua = UserAgent()
    * user_agent = ua.random
    * print(user_agent)

响应内容前端JS做处理反爬

1、html页面中可匹配出内容,程序中匹配结果为空
   * 响应内容中嵌入js,对页面结构做了一定调整导致,通过查看网页源代码,格式化输出查看结构,更改xpath或者正则测试
2、如果数据出不来可考虑更换 IE 的User-Agent尝试,数据返回最标准

请求模块总结

  • urllib库使用流程
# 编码
params = {
    '':'',
    '':''
}
params = urllib.parse.urlencode(params)
url = baseurl + params

# 请求
request = urllib.request.Request(url,headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
  • requests模块使用流程
baseurl = 'http://tieba.baidu.com/f?'
html = requests.get(url,headers=headers).content.decode('utf-8','ignore')
  • 响应对象res属性
res.text :字符串
res.content :bytes
res.encoding:字符编码 res.encoding='utf-8'
res.status_code :HTTP响应码
res.url :实际数据URL地址

解析模块总结

  • 正则解析re模块
import re 

pattern = re.compile(r'正则表达式',re.S)
r_list = pattern.findall(html)
  • lxml解析库
from lxml import etree

parse_html = etree.HTML(res.text)
r_list = parse_html.xpath('xpath表达式')

xpath表达式

  • 匹配规则
1、节点对象列表
   # xpath示例: //div、//div[@class="student"]、//div/a[@title="stu"]/span
2、字符串列表
   # xpath表达式中末尾为: @src、@href、text()
  • xpath高级
1、基准xpath表达式: 得到节点对象列表
2for r in [节点对象列表]:
       username = r.xpath('./xxxxxx')  

# 此处注意遍历后继续xpath一定要以:  . 开头,代表当前节点

写程序注意

# 最终目标: 不要使你的程序因为任何异常而终止
1、页面请求设置超时时间,并用try捕捉异常,超过指定次数则更换下一个URL地址
2、所抓取任何数据,获取具体数据前先判断是否存在该数据,可使用列表推导式
# 多级页面数据抓取注意
1、主线函数: 解析一级页面函数(将所有数据从一级页面中解析并抓取)

增量爬虫如何实现

1、数据库中创建指纹表,用来存储每个请求的指纹
2、在抓取之前,先到指纹表中确认是否之前抓取过

Chrome浏览器安装插件

  • 安装方法
# 在线安装
1、下载插件 - google访问助手
2、安装插件 - google访问助手: Chrome浏览器-设置-更多工具-扩展程序-开发者模式-拖拽(解压后的插件)
3、在线安装其他插件 - 打开google访问助手 - google应用商店 - 搜索插件 - 添加即可

# 离线安装
1、下载插件 - xxx.crx 重命名为 xxx.zip
2、输入地址: chrome://extensions/   打开- 开发者模式
3、拖拽 插件(或者解压后文件夹) 到浏览器中
4、重启浏览器,使插件生效

实现步骤

  • 确定是否为静态
打开二手房页面 -> 查看网页源码 -> 搜索关键字
  • xpath表达式
1、基准xpath表达式(匹配每个房源信息节点列表)
   此处滚动鼠标滑轮时,li节点的class属性值会发生变化,通过查看网页源码确定xpath表达式
  //ul[@class="sellListContent"]/li[@class="clear LOGVIEWDATA LOGCLICKDATA"]

2、依次遍历后每个房源信息xpath表达式
   * 名称: './/a[@data-el="region"]/text()'
   
   # 户型+面积+方位+是否精装
   info_list = './/div[@class="houseInfo"]/text()'  [0].strip().split('|')
   * 户型: info_list[1]
   * 面积: info_list[2]
   * 方位: info_list[3]
   * 精装: info_list[4]
   

   * 楼层: './/div[@class="positionInfo"]/text()'
   * 区域: './/div[@class="positionInfo"]/a/text()'
   * 总价: './/div[@class="totalPrice"]/span/text()'
   * 单价: './/div[@class="unitPrice"]/span/text()'

代码实现

import requests
from lxml import etree
import time
import random
from useragents import ua_list

class LianjiaSpider(object):
  def __init__(self):
    self.url='https://bj.lianjia.com/ershoufang/pg{}/'
    self.blog = 1

  def get_html(self,url):
    headers = {'User-Agent':random.choice(ua_list)}
    # 尝试3次,否则换下一页地址
    if self.blog <= 3:
      try:
        res = requests.get(url=url,headers=headers,timeout=5)
        res.encoding = 'utf-8'
        html = res.text
        # 直接调用解析函数
        self.parse_page(html)
      except Exception as e:
        print('Retry')
        self.blog += 1
        self.get_html(url)


  def parse_page(self,html):
    parse_html = etree.HTML(html)
    # li_list: [<element li at xxx>,<element li at xxx>]
    li_list = parse_html.xpath('//ul[@class="sellListContent"]/li[@class="clear LOGVIEWDATA LOGCLICKDATA"]')
    item = {}
    for li in li_list:
      # 名称
      xpath_name = './/a[@data-el="region"]/text()'
      name_list = li.xpath(xpath_name)
      item['name'] =  name_list[0].strip() if name_list else None
      # 户型+面积+方位+是否精装
      info_xpath = './/div[@class="houseInfo"]/text()'
      info_list = li.xpath(info_xpath)
      if info_list:
        info_list = info_list[0].strip().split('|')
        if len(info_list) == 5:
          item['model'] = info_list[1].strip()
          item['area'] = info_list[2].strip()
          item['direction'] = info_list[3].strip()
          item['perfect'] = info_list[4].strip()
        else:
          item['model']=item['area']=item['direction']=item['perfect']=None
      else:
        item['model'] = item['area'] = item['direction'] = item['perfect'] = None

      # 楼层
      xpath_floor = './/div[@class="positionInfo"]/text()'
      floor_list = li.xpath(xpath_floor)
      item['floor'] =  floor_list[0].strip().split()[0] if floor_list else None

      # 地区
      xpath_address = './/div[@class="positionInfo"]/a/text()'
      address_list = li.xpath(xpath_address)
      item['address'] = address_list[0].strip() if address_list else None

      # 总价
      xpath_total = './/div[@class="totalPrice"]/span/text()'
      total_list = li.xpath(xpath_total)
      item['total_price'] = total_list[0].strip() if total_list else None

      # 单价
      xpath_unit = './/div[@class="unitPrice"]/span/text()'
      unit_list = li.xpath(xpath_unit)
      item['unit_price'] = unit_list[0].strip() if unit_list else None


      print(item)

  def main(self):
    for pg in range(1,101):
      url = self.url.format(pg)
      self.get_html(url)
      time.sleep(random.randint(1,3))
      # 对self.blog进行一下初始化
      self.blog = 1


if __name__ == '__main__':
  start = time.time()
  spider = LianjiaSpider()
  spider.main()
  end = time.time()
  print('执行时间:%.2f' % (end-start))
### 使用XPath爬取北京二手房数据 #### XPath基本概念与工具 XPath是一种用于通过XML文档结构查找信息的语言,在HTML页面上同样适用。为了更方便地编写XPath表达式,可以借助一些辅助工具来测试和验证这些表达式的准确性[^1]。 #### 实战案例分析 以某二手房网站为例,目标是从该平台获取特定城市(如北京市)的房源详情。整个过程涉及定位到包含所需信息的具体标签,并构建合适的XPath路径去提取它们的内容[^2]。 #### Python代码实现 下面是一个简单的Python脚本示例,它利用`requests`库发送HTTP请求并接收响应;再通过`lxml`解析器读取返回的数据流中的HTML内容,最后应用自定义编写的XPath规则完成最终的信息抽取工作: ```python import requests from lxml import etree def fetch_beijing_secondhand_housing(): url = 'https://bj.lianjia.com/ershoufang/' # 假设这是网上北京地区二手房价目页接 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } response = requests.get(url, headers=headers) html_content = response.text tree = etree.HTML(html_content) house_listings = [] titles = tree.xpath('//li/div[@class="info clear"]/div/a/text()')[:10] prices = tree.xpath('//span[@class="totalPrice totalPrice2"]/text()')[:10] for title, price in zip(titles, prices): listing_info = {"title": str(title).strip(), "price": float(price)} house_listings.append(listing_info) return house_listings if __name__ == "__main__": listings = fetch_beijing_secondhand_housing() print(listings) ``` 此段程序会访问指定URL地址下的前十个房产列表项,从中抽取出每套房子的名字以及总价,并将其整理成字典形式存入列表中以便后续处理或展示给用户查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值