首页 > 其他分享 >爬虫基础总结

爬虫基础总结

时间:2024-04-01 21:56:12浏览次数:12  
标签:总结 请求 url 基础 爬虫 json cookie requests data

浏览器问题

 	Elements: 里面的东西是你的 页面源代码 -> script -> 浏览器的二次渲染(table,或其他标签) -> elements里面的代码

    Console: 控制台. 这里面可以写js代码.
    
    Sources: 放着页面源代码和网页的所有资源, 后期会作为我们调试js的最好用的地方。。

    Network:
        headers:
            User-Agent: 请求的设备版本. 以后所有的请求至少给一个这个东西...(app自行判断)
            Referer: 防盗链. 在抓包工具中, 双击url, 如果能获取到你需要的东西. 就不需要加Referer( get可以, post不行)
        Payload: 请求参数 get, post

    Application:
        cookies: 可以清空cookie信息. 方便我们抓包.

    无痕模式:
        没有一些缓存来干扰你

requests -> 发请求专用

		get请求
        Query String parameters
        1. 把参数通过url进行传递
            url = "http://www.baidu.com/s?name=alex&hobby=sb"
        2. 通过params传递参数
            url = "http://www.baidu.com/s"
            dict = {
                name: alex,
                hobby: sb
            }
            requests.get(url, params=dict)

        上述参数. 最终在发送时, 参数都会怼到url上.
		post请求
        下面这两个不会同时出现.
         Form Data, 直接给字典即可

            url = "普通的url"
            data_1 = {
                loginName: 16538989670,
                password: 111111111
            }
            requests.post(url=url, data=data_1)


        Request Payload
           请求挂载. 传输的数据大多数情况下是json字符串..
           在payload里面可以观察到是json格式的数据. 或者, 在请求头里面可以看到
           Content-Type: application/json
                         application/x-www-form-urlencoded  默认

           1.可以通过data传递数据
                import json

                url = "普通的url"
                data_1 = {
                    loginName: 16538989670,
                    password: 111111111
                }
                # separators防止json转化时多出来的空格
                requests.post(url=url, data=json.dumps(data_1, separators=(",", ":")), headers={
                    'Content-Type':'application/json'
                })
           2. 可以直接使用requests里面的json来自动处理
                url = "普通的url"
                data_1 = {
                    loginName: 16538989670,
                    password: 111111111
                }
                requests.post(url=url, json=data_1)  # 方便. 有坑...

                坑:  python自动进行字典转化成json的时候. 会有空格.  服务器那边很有可能就判断这个空格.

           3.混合
                url= "正常的url"
                params = {
                    csrf_token: ""
                }
                data = {
                    params:"xxxx",
                    encSecKey: "xxxx"
                }

                requests.post(url, params=params, data=data)
    如果你在protocol里面看到h2的时候. 表示当前这个请求用的是http2.0的版本.
    大多数网页是兼容http1.1的. 有些网站会屏蔽http1.1.
    python的requests这个模块不支持http2.0
    你用你能使用的所有手段都测试过了. 发现还是不行. 可以考虑用一下http2来请求

    python发送http2的请求: pip install httpx

    import httpx

    client = httpx.Client(http2=True)  # http2的版本
    client.get()
    client.post()
    # 剩下的和requests一样了

    请求头:
        UA: 一定要给的
        Referer: 看情况给
        cookie: 可以直接从浏览器复制过来
            加载有两种情况:
                1. 在响应头里. Set-Cookie
                    我们需要实现浏览器相同的功能
                    浏览器接受到的cookie会在后续的请求中自动代入.
                    咱们的程序也需要实现相同的功能
                    1. 在每次请求url的时候. 手工记录cookie的信息
                        dic = resp.cookies.get_dict()  获取到响应的cookie字典
                        可以对dic进行随意的操作.
                        # 再次发送请求时. 把cookie带上
                        requests.get(url, cookies=cookiejar_from_dict(dic))
                    2. 用session自动来帮你维护cookie
                        session对象中保存的请求头和cookie信息. 会共享.
                        上一次请求用的请求头和set-cookie进来的东西. 会自动增加给
                        下一次请求.
                        免去我们手工维护的麻烦.

                2. 通过js来动态写入cookie(需要我们手工去维护)
                    js可以通过document.cookie = xxxx来重新写入cookie信息

                    服务器返回一个初始化的数字: 123456

                    js:
                        拿到123456
                        进行MD5计算
                        把md5值. 存入cookie

                    以后请求的时候,  就会带着这个md5值给服务器.


                    你的爬虫,想要正确的结果:
                    服务器返回一个初始化的数字: 123456
                    python:
                        拿到123456
                        进行MD5计算
                        把md5值. 存入cookie
                    以后请求的时候,  就会带着这个md5值给服务器.


   以后你发请求. 一定用session. 尽量不要直接requests了

数据解析

 返回数据.
    1. html
        resp = session.get()
        page_source = resp.text
        解析html:
            1. 如果你需要的数据在script里面
                html里面的script中提取需要的内容. 最好的方案是re. 没有之一.

                正则三要素: 开头, 结尾, .*?
                re.compile(r'url: "(?P<url>.*?)",')

            2. 正常的标签中.
                bs4   -> 在处理非标准html的时候. xml, svg, 自定义标签, 属性
                    find(标签, 属性=值)
                    findall(标签, 属性=值)
                    
                xpath -> html好用
                    /
                    // 任意
                    . 当前
                    
    2. js代码
        jsonp: js代码+数据
            xxxx({数据})

    6. json数据
        resp = session.get()
        print(resp.text)  # 先看一眼你获取到的东西是不是json格式.
        dic = resp.json()  # 服务器返回的东西必须是json格式才可以...

数据存储

       处理编码问题
        msg = msg.encode("gbk", "ignore").decode("gbk", "ignore")

    不做为最终给客户的结果.

    1. csv, excel  -> 存储数据, 一条一条的表格形式的数据
        我们首选csv...本质是纯文本 -> txt一样去处理csv

        如果客户非要excel...先存储csv. 然后用pandas. 很容易就搞成excel

    2. mysql
        sql语句: 操作数据库中的数据.
        1. insert into 表(字段1, 字段2, 字段3...) values('值1', '值2', '值3'...)
        2. select * from 表  -> 检测是否插入ok. 数据是否没问题
           select count(*) from 表 -> 看到数据量
        3. delete from 表 where条件 -> 干掉之前的数据
        4. update 表 set 字段 = 值, 字段 = 值...where条件

        python怎么办?
        pymysql -> 去看代码.

    3. mongo
        db.collection.insert({数据})
        新版本的mongo
        db.collection.insert_one({})
        db.collection.insert_many([{}, {}, {}])

        db.collection.find()

    4. redis 很少会直接向redis中存储数据. 做缓存
        程序设计. -> 分布式爬虫.. redis命令 -> 不用记. 需要用redis的时候. 直接搜...

    5. 普通文件. 正常下载即可.
        resp = requests.get()
        with open("", mode="wb") as f:
            f.write(resp.content)

如何提高爬虫效率?

1. 多线程 -> 简单. -> 并发可控.
   直接上线程池. 控制好并发
   相似或者相同的任务适合用多线程 -> 开的多...

 2. 多进程
   你的多个任务之间没有大的关联的时候.
   进程是一个资源单位. 在内存中开辟一个独立的空间

 3. 协程(慎用)
    电影: m3u8 -> 一堆url  -> 下载文件. -> 云服务(七牛云, 各种云), 为了用户看着流畅. 一般是不设防的.
    不设防, 没有访问频率限制.

    不要妨碍网站的正常运营...-> 破坏计算机系统罪. -> 黑客....

爬虫框架-scrapy -> 干活不会首选. -> 框架设计思路
调度器. -> 1. 去除重复请求. 2.请求队列
它有很优秀的设计.

url -> 统一资源定位符 互联网上某台机器上的某个文件/资源

标签:总结,请求,url,基础,爬虫,json,cookie,requests,data
From: https://www.cnblogs.com/ckeri/p/18109463

相关文章

  • [Socket/计算机网络] Java Socket编程:基础篇
    1计算机网络的核心概念网络通信概念:两台设备之间通过网络实现数据传输2.网络通信:将数据通过网络从一台设备传输到另一台设备java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信网络概念:两台或多台设备通过一定物理设备连接起来构成了网络根据网络的覆......
  • gulp入门基础(1),前端热修复面试
    gulp.task(name[,deps],fn)定义一个gulp任务,name是任务名称。[,deps]是任务依赖。fn是任务回调函数。(1)任务依赖的形式可以是:gulp.task(‘two’,[‘one’],function(){//‘one’完成后});gulp.task(‘one’,function(cb){//cb();//returnstream;//ret......
  • [实时流基础 flink] 窗口
    在批处理统计中,我们可以等待一批数据都到齐后,统一处理。但是在实时处理统计中,我们是来一条就得处理一条,那么我们怎么统计最近一段时间内的数据呢?引入“窗口”。文章目录6.1窗口的概念6.2窗口的分类**1)按照驱动类型分**(1)时间窗口(TimeWindow)(2)计数窗口(CountWindow)2......
  • [实时流基础 flink] 窗口函数
    尚硅谷学习笔记6.5窗口函数增量聚合函数(ReduceFunction/AggregateFunction)窗口将数据收集起来,最基本的处理操作当然就是进行聚合。我们可以每来一个数据就在之前结果上聚合一次,这就是“增量聚合”。典型的增量聚合函数有两个:ReduceFunction和AggregateFunction。......
  • 字典树基础(Java实现)
    字典树也叫Trie,是一种树形结构,其中每个节点可以存储一些变量表示该字符串出现的数量。每条边表示一个字符,如节点9存储一个变量cnt,说明存在三个字符串为“cbc” 例题:前缀判定importjava.math.BigInteger;importjava.util.*;publicclassMain{staticclass......
  • 10.Mybatis在springboot中的整合总结
    如果你是从事java开发的那数据库绝对是你离不开的东西我以mysql为例好像都是用的这个吧下载就不多bb了直接看springboot整合添加依赖jdbcmysql和mybatis的依赖然后千万别去当当敲代码了你做一步一个验证一步测试一下是否成功加载成功了properties(或者yaml)中配......
  • 美术生零基础转行TA中(第3天)
    20240401学习目标:刷课至2.9学习内容:2.7模型的本地空间Houdini观察空间:中心点在屏幕中心右手坐标系,右正左负应用程序阶段数据几何阶段顶点着色模型变换视图变换顶点着色几何曲面细分着色裁剪投影变换裁剪屏幕映射光栅化阶段三角形设置三......
  • python基础(四)----列表、字典练习题
    好友管理系统请设计一个好友管理系统,每个功能都对应一个序号,用户可根据提示“请输入您的选项”选择序号执行相应的操作,包括:(1)添加好友:用户根据提示“请输入要添加的好友:”输入要添加好友的姓名,添加后会提示“好友添加成功”。(2)删除好友:用户根据提示“请输入删除好友姓名:”输入要删......
  • TCP/IP 基础知识总结
    我们刚开始接触计算机网络最多的协议,莫属TCP/IP协议了,TCP/IP协议同时也是互联网中最著名的协议。TCP/IP的历史背景最初还没有TCP/IP协议的时候,也就是在20世纪60年代,许多国家和地区认识到通信技术的重要性。美国国防部希望能够研究一种即使通信线路被破坏也能够通过其他......
  • C++基础夯实
     std::copystd::searchstd::back_inserterstd::equalmemcpy演示如何使用std::copy、std::search、std::back_inserter std::equal这四个方法。我们假设有两个向量,一个源向量source,一个目标向量destination。我们将首先使用std::copy方法将源向量中的元素复制......