python爬虫基础总结

本人编程小白,自学了python,在这里分享一下自学爬虫的一些心得,帮助跟我一样的小白少踩坑,同时也是总结一下自己所学。

  1. 爬虫其实就是发送网络请求来获取别人网页的源码,然后在经过数据提取,获取到自己想要的内容。那么首先自然就是发送请求了,python常用的两种库urllib和requests。这里我先讲urllib,urllib是python自带的库,以下是一个基础的爬虫
    from urllib.request import urlopen
    
    # 请求的地址
    url = 'http://www.baidu.com/'
    # 发送请求
    resp = urlopen(url)
    # 打印响应结果
    print(resp.read()) #read()方法用来读取响应的结果
    
    #这样会显示一大堆看不懂类似乱码的东西 因为resp.read()的类型是<class 'bytes'>
    
    #那么需要做一个编码的操作
    
    print(resp.read().decode()[:100]) #decode()默认UTF-8 并且用切片操作截取前100个字符
    
    # 打印结果 <!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charse

    可以看到 其实就是获取了百度网页的html代码

  2. urllib其实有多种响应对象

    from urllib.request import urlopen
    
    # 定义发送的位置
    url = 'http://www.baidu.com/'
    # 发送请求
    resp = urlopen(url)
    # 打印响应数据
    print(resp.read()[:100])
    # 获取响应码
    print(resp.getcode())  # 200
    # 获取访问的url
    print(resp.geturl())   # http://www.baidu.com/
    # 获取响应头信息
    print(resp.info())  # 响应头信息包括 Content-Type Cookie等

  3.  当使用urllib.request.urlopen发送请求时,并不能设置请求参数,那么可以将参数封装到一个Request对象中。比如请求头信息User-Agent 这个是能识别你通过什么发送请求的一个东西,为了防止反爬是需要隐藏的比如

    from urllib.request import Request,urlopen
    url = 'http://httpbin.org/get' #这是HTTP响应测试网站
    
    # 创建Request
    req = Request(url)
    # 发送请求
    resp = urlopen(req)
    # 打印结果
    print(resp.read().decode())
    
    # {
      "args": {},
      "headers": {
        "Accept-Encoding": "identity",
        "Host": "httpbin.org",
        "User-Agent": "Python-urllib/3.10",
        "X-Amzn-Trace-Id": "Root=1-637cbca6-2bb6514c285f49751a84ce8c"
      }
    可以看到 "User-Agent": "Python-urllib/3.10"  这条信息明显就是一条爬虫,那么在爬各大网站的时候别人会直接把你封掉
    
    #那么就需要隐藏User-Agent
    from urllib.request import Request,urlopen
    
    # url = 'http://www.baidu.com/'
    url = 'http://httpbin.org/get'
    
    # 定义headers信息 user_agent隐藏请求头
    headers = {'User-Agent':'Mozilla/5.0 Python666666666'}  #User-Agent可以自定义,当然自定义的肯定不行,这里只是做演示
    # 创建Request
    req = Request(url)
    # 发送请求
    resp = urlopen(req)
    # 打印结果
    print(resp.read().decode())
    #{
      "args": {},
      "headers": {
        "Accept-Encoding": "identity",
        "Host": "httpbin.org",
        "User-Agent": "Mozilla/5.0 Python666666666",
        "X-Amzn-Trace-Id": "Root=1-637cbdab-20bad7777fbe830048086836"
      } 可以看到User-Agent已经改变了

    User-Agent的设置方式有两种,一种就是使用自己浏览器的开发者工具获取(如有不会的小伙伴可以百度或者私信我),第二种是python有一个三方库可以随机生成不同浏览器的User-Agent这个后面说

  4. 在目前网络获取数据的方式有多种方式:GET方式
    大部分被传输到浏览器的html,images,js,css, ... 都是通过GET
    方法发出请求的。它是获取数据的主要方法
    例如:www.baidu.com 搜索
    Get请求的参数都是在Url中体现的(就是在你的网址中会存在中文),如果有中文,需要转码,这时我们可使用

    urllib.parse.urlencode() 转换键值对
    urllib.parse. quote() 转换一个值

     wd= 后面跟的就是中文爬虫两字 进行了转码

    from urllib.request import urlopen,Request
    from urllib.parse import quote,urlencode
    
    
    # UnicodeEncodeError: 'ascii' codec can't encode characters in position 16-17: ordinal not in range(128) 
    # 报错提示 url里的参数,不能有中文
    
    #查询参数
    args = 'python爬虫'
    
    #采用字符串拼接 quote()方法把中文转码
    url = f'https://www.baidu.com/s?wd={quote(args)}'
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'}
    
    req = Request(url,headers=headers)
    
    resp = urlopen(req)
    print(resp.read().decode()[:1500])
    
    #urlencode方法
    args ={'wd':'python爬虫'}
    
    #urlencode方法是转换字典形式的数据
    url = f'https://www.baidu.com/s?{urlencode(args)}'
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'}
    req = Request(url,headers=headers)
    resp = urlopen(req)
    print(resp.read().decode()[:1500])

     

  5. 接下来做一个简单网页的爬取  url:https://www.ximalaya.com/yinyue

    from urllib.request import Request,urlopen
    from time import sleep
    
    def spider_music(_type,page):
        # 构造URL地址
        for num in range(1,page+1):
            if num == 1:
                url = f'https://www.ximalaya.com/yinyue/{_type}'
            else:
                url = f'https://www.ximalaya.com/yinyue/{_type}/p{num}/'
            headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'}
            # 构造请求对象
            req = Request(url,headers=headers)
            # 发送请求
            resp = urlopen(req)
            # 获取响应
            print(resp.getcode())
            print(resp.geturl())
            # print(resp.read().decode()[:2000])
            # 休眠 防止爬取速度过快对别人服务器造成影响
            sleep(1)
        
    
    if __name__ == '__main__':
        spider_music('minyao',3)

    这里需要分析url的构成,如何动态的获取到多页url和想要的音乐属性

暂时总结这么多会持续更新,手敲不易希望多多支持,有问题的可以私信我,大家一起学习

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值