爬虫套路之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-Agent
的Referer
,还有就是Cookie,那Cookie
和Referer
一样,把页面上的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)