爬虫入门

requests模块的学习

使用前

  • pip install request

发送get, post请求,获取响应

  • response = requests.get(url)
  • response = requests.post(url, data = {请求体的字典})

response的方法

  • response.text
    – 往往出现乱码,出现乱码时在前面加一句:response.encoding = “utf-8”

  • response.content.decode()
    – 把响应的二进制流转化为str类型(实际上是一个json字符串)

  • response.request.url #发送请求的URL地址

  • response.url #response响应的URL地址

  • response.request.headers #请求头

  • response.headers #响应请求

获取网页源码的正确方式

(依次尝试以下三种方法,一定有一个可以正确获取解码后的字符串)
  1. response.content.decode()
  2. response.content.decode(“gbk”)
  3. response.text

发送header请求

  • 为了模拟浏览器,不被服务器阻拦,获取和浏览器一模一样的内容
    headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36", 
    "Referer":"https://www.baidu.com/"}
    
    response = requests.get(url, headers=headers)
    

使用超时参数

  • request.get(url, headers=headers, timeout=3) #3秒之内必须返回响应,否则报错

retrying模块的学习

  • pip install retrying
    from retrying import retry
    
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"}
    
    @retry(stop_max_attempt_number=3) #反复执行3次,都报错才会报错
    def _parse_url(url):
        print("*"*100)
        response = requests.get(url, headers=headers, timeout=5)
        return response.content.decode()
    

处理cookie相关的请求

  • 直接携带cookie请求url地址
    1. cookie放在headers中
      headers = {"User-Agent":"......", "Cookie":"......"}
    2. cookie字典传给cookies参数
      requests.get(url,cookies=cookie_dict)
  • 先发送post请求,获取cookie,再上cookie请求登录后的页面
    session = requests.session()		#实例化session。session具有的方法和cookie一样
    session.post(url,data,headers)		#发送post请求,执行的同时session自动保存了服务器在本地设置的cookie
    session.get(url)					#会带上之前保存的cookie
    

数据提取方法

json

  • 一个看起来像python类型(列表,字典)的字符串

  • 哪里会返回json数据:

    • 浏览器切换到手机版
    • 抓包app
  • json.loads

    • 把看起来像python类型的json字符串转化为真正的python类型
    • json.loads(json字符串) (返回的即是字典类型)
  • json.dumps

    • 把python类型转化为json字符串
    • json.dumps({ "a" : "a" , "b" : 2})
      • json.dumps(ret,ensure_ascii=False, indent=2)
        • ensure_ascii : 让编码的中文显示为中文
        • indent:能够让下一行在上一行的基础上添加空格

xpath和lxml

  • xpath

    • 一门从html中提取数据的语言
  • xpath语法

    • xpath helper插件:帮助我们从elements中定位数据
    • 选择节点/标签
      • /html/head/meta:能够选中html下的head下一级的所有meta标签
      • //li:当前页面上所有的li标签
      • /html/head//link:能够选中head下所有级的所有link标签
      • @:定位
        • //div[@class='aaaa']/ul/li:选择class=aaaa的div下的ul下的li标签
        • /a/@href:选择a标签下href的值
      • /a/text():获取a标签下的文本
      • /a//text():获取a标签下的所有文本
      • ./a:当前结点下的a标签
  • lxml

    • 获取html字符串
    • 安装:pip install lxml
    • 使用
       from lxml import etree
       element = etree.HTML("html字符串")
       element.xpath("xpath语法")
      

一些常用的基础知识点

  • format:字符串格式化的一种方式
    • "吃{}个苹果".format(1)
    • "吃{}个苹果".format([1,2,3])
    • "吃{}个苹果".format({1,2,3})
    • "吃{}个苹果和{}个梨".format({1,2,3}, [1,2,3])
    • "吃{}个苹果和{}个梨".format({1,2,3}, 1)
  • 列表推导式
    • 帮助我们快速的生成包含一堆数据的列表
      [i+10 for i in range(10)]----->[10,11,12…19]
      ["1月{}日".format(i) for i in range(1,10)]----->[“1月1日”,“1月2日”…“1月9日”]
  • 字典推导式
    • 帮助我们快速的生成包含一堆数据的字典
      {i+10:i for i in range(10)}----->{10:0, 11:1,12:2…19:9}
      {"a{}".format(i):10 for i in range(3)}----->{“a0”:10, “a1”:10, “a2”:10}
  • 三元运算符
    • result = a if 表达式 else b 表达式成立取a,否则取b

代码书写

  1. url
    • 知道url地址的规律和总页数:构造url地址的列表
    • start_url
  2. 发送请求,获取响应
    • requests
  3. 提取数据
    • 返回json字符串:json模块
    • 返回的是html字符串:lxml模块配合xpath提取数据
  4. 保存数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值