xpath的包含

  • //div[contains(@class,'i')]

xpath有哪些常用方法

  • // 从任意位置选择节点
    • //a/text() a下的文本
    • //a//text() a下所有的文本
  • . 当前路径
  • @符号
    • a/@href
    • div[@class='a']
  • text()
    • a[text()='下一页']
  • .. 上一级
  • //a[1]
  • //a[last()]
  • //a[postion()<4]
  • //a[1]|//a[5]
  • a[contains(text(),"下一页")]

实现爬虫的套路

  • 准备url

    • 准备start_url
      • url地址规律不明显,总数不确定
      • 通过代码提取下一页的url
        • xpath
        • 寻找url地址,部分参数在当前的响应中(比如,当前页码数和总的页码数在当前的响应中)
    • 准备url_list
      • 页码总数明确
      • url地址规律明显
  • 发送请求,获取响应

    • 添加随机的User-Agent,反反爬虫
    • 添加随机的代理ip,反反爬虫
    • 在对方判断出我们是爬虫之后,应该添加更多的headers字段,包括cookie
    • cookie的处理可以使用session来解决
    • 准备一堆能用的cookie,组成cookie池
      • 如果不登录
        • 准备刚开始能够成功请求对方网站的cookie,即接收对方网站设置在response的cookie
        • 下一次请求的时候,使用之前的列表中的cookie来请求
      • 如果登录
        • 准备多个账号
        • 使用程序获取每个账号的cookie
        • 之后请求登录之后才能访问的网站随机的选择cookie
  • 提取数据

    • 确定数据的位置

      • 如果数据在当前的url地址中

        • 提取的是列表页的数据
          • 直接请求列表页的url地址,不用进入详情页
        • 提取的是详情页的数据
            1. 确定url
            1. 发送请求
            1. 提取数据
            1. 返回
      • 如果数据不在当前的url地址中

        • 在其他的响应中,寻找数据的位置
            1. 从network中从上往下找
            1. 使用chrome中的过滤条件,选择出了js,css,img之外的按钮
            1. 使用chrome的search all file,搜索数字和英文
    • 数据的提取
      • xpath,从html中提取整块的数据,先分组,之后每一组再提取
      • re,提取max_time,price,html中的json字符串
      • json
  • 保存
    • 保存在本地,text,json,csv
    • 保存在数据库

lxml模块如何使用

  • from lxml import etree
  • element = etree.HMTL(str,bytes)
  • element.xpath(“xpath”)
  • etree.tostring(element) #把element转化为字符串

queue模块如何使用

  • from queue import Queue
  • 实例化
  • queue.put() #get计数减一
  • queue.get()
  • queue.task_doen() #计数减一
  • queue.join() #让主线程阻塞