当前位置: 首页>后端>正文

Python爬虫与反爬虫开发从入门到精通 pdf python反爬虫机制

爬虫套路之user-agent

爬虫

不管是html" class="superseo">python还是php,jsva,在你爬取网页的时候都是以python,php,java的‘名义’去爬取的页面,一旦网页发现了这些关键词的时候就不会返回你想要的数据,所以在python中就要自己设置user-agent:
常用的请求头chrome:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36

反爬原理

简单来说就是使用nginx条件判断每一次请求的User-Agent的值,在nginx配置文件下新建文件

> server{
>    listen 80;
>    server_name www.baidu.com; #自己服务器的域名
>    charset utf-8;
>    location /user/admin/ {
>        if ($http_user_agent ~* (python)){
>            return 403;
>        }
>    root /roor/www/html;
>    index index.html
>    }
> }

这段的意思就是查找请求头中是否有python,如果有返回403,
在root指令设定的目录下简历层级目录/user/admin 最后在admin目录中放index.html文件,保存后,向nginx发送重新加载配置的信号立即生效,

先利用/usr/local/nginx/sbin/nginx -t测试配置文件修改是否正常
/usr/local/nginx/sbin/nginx -s reload重新加载

Cookie 反爬虫

爬虫
1.规定入口

有的时候页面回去判断你从何处来到这个页面的,处理的方式也是千奇百怪,譬如说User-AgentReferer,还有就是Cookie,那CookieReferer一样,把页面上的Cookie写在你的headers中就好了

反爬
1.规定入口实现

默认的爬虫是只请求HTML文本资源不会主动保存Cookie。 但是浏览器会自动检查是否存在,若存在则保存到本地,且往后的每次请求都会自动携带对应的Cookie值,这个时候只需要在服务端进行效验即可,也是在nginx的配置文件中添加就好了

>location /user/admin/login.html {
>    	#在响应头中设置固定的Cookie值
> 	add_header Set-Cookie *cookir-first=12er56yu78op*
>   root /roor/www/html;
>   index login.html
>}
>location /user/admin/index.html {
>	#如果请求头中的Cookie值不符合要求,则将网页临时重定向到login.html
>	if ($http_cookie !~*"cookir-first=12er56yu78op"*){
>		rewrite index.html ./login.html redirect; 
>	}
>	root /roor/www/html;
>   index index.html
>}

配置好之后还是要重新加载nginx的配置
直接写死的方式比较简单,可以通过js自动生成,然后传到后台匹配,(EG:时间戳+用户id的md5加密,前后台对比)
(ng也可以使用正则,或者跟lua语言结合,nginx有个ngx_http_lua_module模块)

字体

有的时候在html上面显示的数字在爬取下来的地方居然是乱码
这是因为反爬使用了新的字体格式,也就是.woff文件,我的处理方式就是将.woff文件下载下来
然后进行转换

from fontTools.ttLib import TTFont
font = TTFont(path)
font.saveXML(newpath)

将你的woff文件转化为xml文件然后进行对比就好了


session 遇到了一个网站 , 失败率比较高 , 会发生 500啊 502, 503 之类的错误

from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry_strategy = Retry(
    total=8,  # 最大重试次数
    backoff_factor=0.5,  # 重试之间的退避因子
    status_forcelist=[500, 502, 503, 504],  # 需要触发重试的HTTP状态码
)

# 创建一个带有重试策略的HTTP适配器
adapter = HTTPAdapter(max_retries=retry_strategy)

# 创建一个会话对象,并将HTTP适配器添加到会话中
reqsession = requests.Session()
reqsession.mount("http://", adapter)
reqsession.mount("https://", adapter)



https://www.xamrdz.com/backend/3r31960021.html

相关文章: