从零开始学爬虫--Python[日更] # whisky和你一起实战学爬虫

Welcome! - -[whisky带你学IT]- -公众号

出入T圈小菜鸡,因工作需要开始接触爬虫,维护项目,接下来的几天里我们一起从零升级,闯关打败爬虫,谨以此帖,记录经验。

在这里插入图片描述

1. 爬虫入门:

1.1 爬虫的分类: 累积式爬虫 聚焦爬虫(针对特定网站) 深网爬虫

1.2 爬虫的流程:

1.向url 发送请求,获取响应
2.对响应进行提取
3.提取url,继续发送请求获取响应
4.提取数据,保存

1.3 http和https

  • 在发送请求,获取响应的过程中 就是发送http或https的请求,获取http或https的响应
  • http :80 端口 https:443 端口
    在这里插入图片描述

1.3.1 http 请求过程

  • 浏览器输入 url 发送请求,获取响应

  • 返回响应体中,带有css,js,图片等url地址,以及ajax代码,浏览器按照响应内容中的顺序发送其他请求,获取相应的响应。

  • 浏览器每获取一个响应并在浏览器中展示,直到获取全部响应,并在展示的结果中添加内容或修改————这个过程叫做浏览器的渲染

  • 爬虫只会请求url地址,对应的拿到url地址对应的响应(该响应的内容可以是html,css,js,图片等)浏览器渲染出来的页面和爬虫请求的页面很多时候并不一样,所以在爬虫中,需要以url地址对应的响应为准来进行数据的提取

  • http 请求的形式
    在这里插入图片描述

  • Host (主机和端口号)
    Connection (链接类型)
    Upgrade-Insecure-Requests (升级为HTTPS请求)
    User-Agent (浏览器名称)
    Accept (传输文件类型)
    Referer (页面跳转处)
    Accept-Encoding(文件编解码格式)
    Cookie (Cookie)
    x-requested-with :XMLHttpRequest (表示该请求是Ajax异步请求)

  • http 重要的响应头
    -1. set-cookie(对方服务器设置cookie到用户浏览器的缓存)
    -2. last-modified(对方静态页面最后更新时间)

  • 响应状态码
    常见的状态码:

    200:成功
    302:临时转移至新的url
    307:临时转移至新的url
    404:找不到该页面
    500:服务器内部错误
    503:服务不可用
    所有的状态码都不可信,一切以是否获取到数据为准

1.4 字符串

  • UTF-8是Unicode的实现方式之一
  • py3 中的字符串:str bytes
str 使用encode方法转化为 bytes
s = 'abc'
print(type(s))
#str编码变为bytes类型
b = s.encode
print(type(b))
bytes 通过decode转化为 str
b = b'abc'
print(type(b))
#bytes类型解码成为str类型
s = b.decode()
print(type(s))

在这里插入图片描述

2.2 请求的发送方法

2.2.1 request模块

-requests 模块底层实现就是urllib
作用: 发送网络请求,返回响应数据
中文文档 : http://docs.python-requests.org/zh_CN/latest/index.html

  • requests 基础get操作
import requests

# 目标url
url = 'https://www.baidu.com'

# 向目标url发送get请求
response = requests.get(url)

# 打印响应内容
print(response.text)


  • response的常用属性
    response.text 响应体 str类型
    respones.content 响应体 bytes类型
    response.status_code 响应状态码
    response.request.headers 响应对应的请求头
    response.headers 响应头
    response.request.cookies 响应对应请求的cookie
    response.cookies 响应的cookie(经过了set-cookie动作)
  • response.text

类型:str
解码类型: requests模块自动根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
如何修改编码方式:response.encoding=”gbk”

  • response.content

类型:bytes
解码类型: 没有指定
如何修改编码方式:response.content.deocde(“utf8”)

2.1.1 requests 两种发送参数的请求

  • 方式一:利用params参数发送带参数的请求
  • 方式二:直接发送带参数的url的请求

2.2.2 requests发送post 请求

response = requests.post("http://www.baidu.com/",data = data,headers=headers)

TODO

  • 花了¥130 大洋报了期货从业考试,在不学习,打水漂了。倒计时18days。发挥大中国从小培养的应试教育功底。开搂!

2 使用代理

2.1 为什么要使用代理
让服务器以为不是同一个客户端在请求
防止我们的真实地址被泄露,防止被追究
-
正向代理:对于浏览器知道服务器的真实地址,例如VPN
反向代理:浏览器不知道服务器的真实地址,例如nginx

  • 2.4 代理的使用
    用法:
requests.get("http://www.baidu.com",  proxies = proxies)
#proxies的形式:字典

#例如:

  proxies = {
      "http": "http://12.34.56.79:9527",
      "https": "https://12.34.56.79:9527",
      }
  • 2.5 代理IP的分类
    根据代理ip的匿名程度,代理IP可以分为下面四类:

    透明代理(Transparent Proxy):透明代理虽然可以直接“隐藏”你的IP地址,但是还是可以查到你是谁。
    匿名代理(Anonymous Proxy):使用匿名代理,别人只能知道你用了代理,无法知道你是谁。

    高匿代理(Elite proxy或High Anonymity Proxy):高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。

    在使用的使用,毫无疑问使用高匿代理效果最好

    从请求使用的协议可以分为:

    http代理
    https代理
    socket代理等
    不同分类的代理,在使用的时候需要根据抓取网站的协议来选择

  • 2.6 代理IP使用的注意点
    -----反反爬

    使用代理ip是非常必要的一种反反爬的方式

    但是即使使用了代理ip,对方服务器任然会有很多的方式来检测我们是否是一个爬虫,比如:

    一段时间内,检测IP访问的频率,访问太多频繁会屏蔽

    检查Cookie,User-Agent,Referer等header参数,若没有则屏蔽

    服务方购买所有代理提供商,加入到反爬虫数据库里,若检测是代理则屏蔽

    所以更好的方式在使用代理ip的时候使用随机的方式进行选择使用,不要每次都用一个代理ip

    -----代理ip池的更新

    购买的代理ip很多时候大部分(超过60%)可能都没办法使用,这个时候就需要通过程序去检测哪些可用,把不能用的删除掉。

    2.2.3 requess模块处理cookie相关的请求

    • requests处理cookie的三种方法
      1.cookie字符串放在headers中
      2.把cookie字典反传给请求方法的cookies参数接收
      3.使用requests提供的session模块
    • cookie 添加在headers中
      在这里插入图片描述
headers中的cookie:
使用分号(;)隔开
分号两边的类似a=b形式的表示一条cookie
a=b中,a表示键(name),b表示值(value)
在headers中仅仅使用了cookie的name和value

在这里插入图片描述
由于headers中对cookie仅仅使用它的name和value,所以在代码中我们仅仅需要cookie的name和value即可

headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Cookie":" Pycharm-26c2d973=dbb9b300-2483-478f-9f5a-16ca4580177e; Hm_lvt_98b9d8c2fd6608d564bf2ac2ae642948=1512607763; Pycharm-26c2d974=f645329f-338e-486c-82c2-29e2a0205c74; _xsrf=2|d1a3d8ea|c5b07851cbce048bd5453846445de19d|1522379036"}

requests.get(url,headers=headers)

注意:通过一个程序专门来获取cookie供其他程序使用

//cookies的形式:字典
cookies = {"cookie的name":"cookie的value"}
//使用方法:
requests.get(url,headers=headers,cookies=cookie_dict}
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c C语言作为一门基础且强大的编程语言,在底层系统编程算法实现方面表现卓越,其效率与灵活性备受推崇。其中,“用指针实现的C语言排序算法”这一主题,融合了C语言的核心概念——指针,以及数据结构算法的基础知识。指针是C语言的一大特色,它能够直接操作内存地址,从而为高效的数据操作提供了有力支持。在排序算法中,指针通常被用作迭代工具,用于遍历数组或链表,进而改变元素的顺序。 常见的排序算法,如冒泡排序、选择排序、插入排序、快速排序归并排序等,都可以借助指针来实现。具体而言: 冒泡排序:通过交换相邻元素来实现排序。在C语言中,可以定义一个指向数组的指针,通过指针的递增或递减操作来遍历数组,比较相邻元素并在必要时进行交换。 选择排序:每次从剩余部分中找到最小(或最大)元素,然后将其与第一个未排序的元素进行交换。指针可用于标记已排序未排序部分的边界。 插入排序:将元素插入到已排序的部分,以保持有序性。可以使用指针跟踪已排序部分的末尾,并在找到合适位置后进行插入操作。 快速排序:采用分治策略,选择一个“基准”元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分的所有元素都大于基准。这一过程通常通过递归来实现,而基准元素的选择划分过程往往涉及指针操作。 归并排序:将数组分为两半,分别对它们进行排序,然后再进行合并。在C语言中,这通常需要借助动态内存分配指针操作来处理临时数组。 在实现这些排序算法时,理解指针的用法极为关键。指针不仅可以作为函数参数传递,从而使排序算法能够作用于任何可寻址的数据结构(如数组或链表),而且熟练掌握指针的解引用、算术运算比较操作,对于编写高效的排序代码至关重要。然而,需要注意的是,尽管指针提供了直接操作内存的便利,但不当使用可能会引发错误,例如内存泄漏、空指针
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在电子设备设计中,多功能按键的实现是至关重要的技术,它能够为用户提供丰富多样的交互方式,比如单击、双击长按等操作。本文将深入探讨如何设计一个多功能按键系统,涵盖按键识别逻辑、接口函数设计,以及如何避免使用定时器。 首先,我们需要理解多功能按键的基本原理。在硬件层面,按键通常是通过连接到微控制器(MCU)的一个输入引脚来实现的。当按键未被按下时,该引脚保持高电平;而当按键按下时,引脚会与地短路,变为低电平。因此,通过检测该引脚的状态,就可以判断按键是否被按下。 接下来,我们来探讨如何识别不同的按键操作。单击是最基本的操作,通常定义为按键快速按下并释放。双击则是在短时间内连续两次单击,而长按则是按键被按下并持续一段时间。为了实现这些功能,我们需要在软件中加入一些延时处理。例如,当我们检测到按键按下事件后,可以启动一个短暂的延时。如果在此期间再次检测到按键按下,则判断为双击;如果延时结束仍未检测到第二次按下,则认为是单击。对于长按操作,可以设定一个较长的延时,如果按键在这段时间内一直保持按下状态,则识别为长按。 接口函数设计是软件工程中的重要环节。对于多功能按键,我们可以设计以下核心接口: void Key_Init(void):初始化按键,设置中断或轮询模式,并设置初始状态。 uint8_t Key_Scan(void):扫描按键状态,返回当前按键的操作类型,例如,0表示无操作,1表示单击,2表示双击,3表示长按。 void Key_Callback(uint8_t key_event):这是一个注册的回调函数,根据Key_Scan()返回的事件类型执行相应的操作。 在实际应用中,为了避免频繁的中断请求降低功耗,我们有时会选择使用延时而非定时器。延时函数可以通过循环计数实现,例如,使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值