• Spider爬虫入门(发送Get Post请求、携带请求头、Cookie、Session、响应Response、获取二进制数据 、解析Json数据)


    一、爬虫介绍

    爬虫:Spider 网络蜘蛛 爬虫也叫网页蜘蛛,网络机器人,就是模拟客户端发送网络请求,获取请求对应的响应,一种按照一定规则,自动抓取互联网信息的程序。
    
    • 1

    本质原理

    现在所有的软件原理大部分都是基于http请求发送和获取数据的,模拟发送http请求从别人的服务端获取数据。绕过反扒不同程序反扒措施不一样比较复杂。
    
    • 1

    爬虫是否合法?

    爬虫协议:每个网站根路径下都有robots.txt,这个文件规定了 该网站 哪些可以爬取 哪些不能爬
    
    • 1

    请添加图片描述

    二、Requests模块发送Get请求

    模拟发送http请求的模块:requests 不仅仅做爬虫用它,调用第三方接口,也是要用它
    
    • 1

    安装Requests

    pip install requests
    
    • 1

    模拟使用:

    import requests
    
    res = requests.get('https://blog.csdn.net/MeiJin_')
    print(res.text)         # http响应体文本内容 从此解析到想要的数据 入库!
    
    • 1
    • 2
    • 3
    • 4

    延时知识点:短链接

    可以延伸短链接 底层原理一个很长的链接发送请求 数据保存到本地 生成链接
    
    • 1

    三、Get请求携带参数

    方式一

    直接在请求地址中添加    www.baidu.com?info='Like'
    
    res = requests.get('https://www.baidu.com/?info=%27%E6%83%B3%E8%A6%81%E7%9A%84%E4%BF%A1%E6%81%AF%27')
    print(res.text)
    
    • 1
    • 2
    • 3
    • 4

    方式二

    使用params参数携带
    
    res = requests.get('https://www.baidu.com/s', params={
        'info1': 'Like',
        'info2': 'Boys',
    })                 # 实际请求地址是 https://www.baidu.com/s?info1=Like&info2Boys
    print(res.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    URL编码与解码

    从地址栏里拿出数据 都会被Url进行编码和解码
    
    from urllib import parse        # 内置模块
    
    info1 = parse.quote('Mr.梅')     #   编码
    info2 = parse.unquote('Mr.%E6%A2%85')   #   解码
    print(info1)  # Mr.%E6%A2%85
    print(info2)  # Mr.梅
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    请添加图片描述

    四、携带请求头

    朝地址发送请求 会在请求头中看到我们的信息 型号不一样 这个内容是不一样的

    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
     } 
     User-Agent:客户端类型:有浏览器、手机端浏览器、爬虫类型,程序,scrapy一般伪造成浏览器
    
    • 1
    • 2
    • 3
    • 4

    模拟使用

    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
     } 
    res=requests.get('https://dig.chouti.com/',headers=header)
    print(res.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们爬去某个网站 发送请求不能正常返回说明模拟的不够 只要数据对应的上就能返回对应的数据
    一般网站可以通过Referer来做反扒如果要登录,模拟向登录接口发请求,正常操作必须在登录页面上才能干这事
    如果没有携带referer,它就认为你是恶意的就会拒绝。

    五、携带Cookie

    方式一

    模拟抽屉网点赞信息
    data = {'linkId': '37001777'}		# 发送请求我们可以获得到账号ID
    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
        
        'Cookie': 'deviceId=web.eyJ0eXAiOiJKV1Qixxxxxxxxxxxxxxxxxxxxxxxxxxx.........
    
    }
    
    res = requests.post('https://dig.chouti.com/link/vote', data=data, headers=header)
    print(res.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    方式二

    通过cookie参数:因为cookie很特殊,一般都需要携带,模块把cookie单独抽取成一个参数,是字典类型,以后可以通过参数传入
    
    data = {'linkId': '37001777'}		# 发送请求我们可以获得到账号ID
    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',}
    res = requests.post('https://dig.chouti.com/link/vote', data=data, headers=header, cookies={'key': 'value'})
    print(res.text)     				# cookies格式都是字典格式 按照输入即可
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    六、发送Post请求

    方式一

    先发送错误登录请求 看返回数据是否对错 输入对的密码 获取cookie 通过Cookie登录
    
    data = {
        'username': 'xxxxx',
        'password': 'xxxxx',   # 错误的 请求码是 error 5 正确的是0
        'captcha': 'cccc',
        'remember': 1,
        'ref': 'http://www.aa7a.cn/',
        'act': 'act_login'
    }
    
    res = requests.post('http://www.aa7a.cn/user.php', data=data)
    print(res.text)     # {"error":0,"ref":"http://www.aa7a.cn/"}
    print(res.cookies)  # RequestCookieJar对象响应头中得cookie,如果正常登录,这个cookie 就是登录后的cookie
    
    res2 = requests.get('http://www.aa7a.cn/', cookies=res.cookies) # 访问首页,携带cookie,
    # res2 = requests.get('http://www.aa7a.cn/')
    print('xxxxUsername' in res2.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    方式二

    data = {
        'username': 'xxxxx',
        'password': 'xxxxx',   # 错误的 请求码是 error 5 正确的是0
        'captcha': 'cccc',
        'remember': 1,
        'ref': 'http://www.aa7a.cn/',
        'act': 'act_login'
    }
    res = requests.post('http://www.aa7a.cn/user.php', json= {"key": "Value"})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    request.session的使用:当request使用,但是它能自动维护cookie

    session = requests.session()
    data = {
        'username': 'xxxxx',
        'password': 'xxxxx',   # 错误的 请求码是 error 5 正确的是0
        'captcha': 'cccc',
        'remember': 1,
        'ref': 'http://www.aa7a.cn/',
        'act': 'act_login'
    }
    
    res = session.post('http://www.aa7a.cn/user.php', data=data)
    res1 = session.get('http://www.aa7a.cn')
    print('xxxxUsername' in res1.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    七、响应Response

    import requests 		# Response对象有很多属性和方法
    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',}
    respone = requests.get('https://www.jianshu.com', params={'name': 'Like', 'age': 20}, headers=header)
    
    # respone属性
    print(respone.text)  		# 响应体的文本内容
    print(respone.content)  	# 响应体的二进制内容
    print(respone.status_code)  # 响应状态码
    print(respone.headers)  	# 响应头
    print(respone.cookies)  	# 响应cookie
    print(respone.cookies.get_dict())  # cookieJar对象,获得到真正的字段
    print(respone.cookies.items())  # 获得cookie的所有key和value值
    print(respone.url)  		# 请求地址
    print(respone.history)  	# 访问这个地址,可能会重定向,放了它冲定向的地址
    print(respone.encoding)  	# 页面编码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    八、获取二进制数据

    获取二进制数据 图片

    res = requests.get('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fup.enterdesk.com%2Fedpic_source%2F81%2F71%2F2b%2F81712bdce2d6966b9942f249031aba8e.jpg&refer=http%3A%2F%2Fup.enterdesk.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671809061&t=bc2a02c107ba2835560c30bb4811c822')
    with open('MeiNu.jpg', 'wb')as f:
        f.write(res.content)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    获取二进制视频

    res=requests.get('https://vd3.bdstatic.com/mda-mk21ctb1n2ke6m6m/sc/cae_h264/1635901956459502309/mda-mk21ctb1n2ke6m6m.mp4')
    with open('美女.mp4', 'wb') as f:
        for line in res.iter_content():
            f.write(line)
    
    • 1
    • 2
    • 3
    • 4

    九、解析Json数据

    res = requests.get(
        'https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query='
        '%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json')
    print(res.text)
    print(type(res.text))
    print(res.json()['results'][0]['name'])
    print(type(res.json()))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请点点赞收藏+关注谢谢支持 !!!

  • 相关阅读:
    8、架构-分布式的共识
    ios上传图片旋转90度的解决办法 - nextcloud
    汉诺塔问题
    用pytorch实现神经网络
    人工神经网络的分类包括,人工神经网络的分类有
    计组 | 【三 存储系统】强化阶段应用题与例题类型总结
    jQuery学习:内置动画 淡出/淡入 展开/收缩 显示/隐藏
    集成并查集
    数据库并发问题及四种隔离级别
    【C语言】职工管理系统详解(文件操作)
  • 原文地址:https://blog.csdn.net/MeiJin_/article/details/128009357