进入
组
,
一个
上升
研究
习惯
背
建立
技能
技能
首先,爬虫和Http代理导致寻找代理测试代理来使用代理来连续地提供代理服务以进一步集成。二、如何用Nginx搭建一个正向代理
1.爬虫和Http代理的原因
做过爬虫的都应该知道网站和数据太多了。如果爬虫抓取速度过快,必然会触发网站的反抓取机制。几乎一样的招数就是封IP。有两种解决方案:
同一IP,放慢速度(爬取速度慢)使用代理IP访问(推荐)第一种方案牺牲了时间和速度来换取数据,但总的来说我们的时间非常宝贵,理想情况下我们可以在最短的时间内得到最多的数据。所以推荐第二种方案,那么哪里能找到这么多代理IP呢?
寻找代理
程不明白的时候就去找。谷歌,杜娘,输入关键词:免费代理IP。前几页几乎都是提供代理IP的网站。逐一打开后,观察到几乎是一个列表页面,显示几十个或者几百个IP。
但是仔细观察,你会发现每个网站提供的免费IP都是有限的。如果你用几个,你会发现有些已经失败了。当然,他们更喜欢你买别人的代理,他们靠这个赚钱。
作为一个狡猾的程,当然不能因为这个困难就下跪。仔细想想,既然搜索引擎可以搜索那么多提供代理的网站,那么每个网站提供几十个或者几百个。如果有10个网站,总共会有几百到几千个IP。
好了,你要做的就是把这些网站录下来,用程序来抓IP。想想是不是很简单。
测试代理
以刚才的方式,应该可以获得成百上千个代理IP。
等等,这么多IP,别人真的是免费给你的吗?当然不是。如前所述,这些代理中的很大一部分已经无效。那怎么办?您如何知道哪些代理有效,哪些不可用?
很简单,挂掉这些代理,访问一个稳定的网站,看看能不能正常访问。能正常访问的是可用的,不能访问的是无效的。
最快的方法是使用curl命令测试代理是否可用:
#使用代理48.139.133.93:3128访问网易主页
curl-x "48.139.133.93:3128 "
" http://www.163.com "
当然,这种方法只是为了方便演示,最好的实用方法是:
使用代理以多线程模式访问网站,然后输出可用的代理。
这样做可以尽快找到可用的代理。
使用代理
现在我们可以通过上面的方法找到可用的代理。如果应用到程序中,我就不用多说了,大部分都要用到。
例如,只需将可用的代理输入到一个文件中,每行都是一个代理,然后您可以这样使用它:
读取代理文件随机选择代理IP,发起HTTP请求这样,如果有几百个代理,基本上可以在一段时间内持续抓取某个网站的数据,抓取几千条数据也不是问题。
但是,如果我想不断的从某个网站获取数据,或者抓取几百万甚至上亿的网页,那么这个肯定不行。
代理的持续供应
刚才的方法是一次性抓取几个代理网站,然后通过程序测试每个代理是否可用,得到可用代理的列表。但是这只是一次性的,代理的数量往往很少,肯定不能满足连续爬行的需求。那么,我们如何继续寻找可用的代理呢?
找到更多的代理网站(数据基础)定时监控这些代理网站,获取代理拿到代理IP后,程序自动检测,输出可用代理(文件或数据库)程序加载文件或数据库,随机选取代理IP发起HTTP请求按照上面的方式,你可以写一个程序,自动收集代理,然后爬虫定期从文件/数据库中获取,然后使用。但是有一个小问题。你怎么知道每个代理的质量?也就是说代理有多快?
在检测代理时,记录请求响应时间响应时间从短到长,加权重值,响应短的使用率高一些限制某段时间内最大使用次数前面几点只是基础。这三点可以进一步优化你的代理程序,输出一个有优先级的代理列表,爬虫根据权重和最大使用次数来使用代理。这样做的好处是保证使用优质的代理,同时防止某个代理被频繁使用和阻塞。
面向服务
经过一系列的改进和优化,已经建立了一个可用的代理服务,它只基于文件系统或数据库。
如果爬虫要使用这些代理,只能读取文件或数据库,然后按照一定的规则选择代理使用。这个比较麻烦。能不能让爬虫更容易使用代理?然后你需要使代理访问面向服务。
有一个众所周知的服务器软件squid,利用它的cache_peer邻居代理机制就可以完美做到这一点。
按照一定格式的squid的cache_peer机制将代理列表的代理写入配置文件。
Squid是一个代理服务器软件,通常是这样使用的。如果爬虫在机器A上,squid安装在机器B上,要抓取的网站服务器是机器C,代理IP是机器D/E/F…
不使用代理:爬虫机器A请求 —> 网站机器C使用代理:爬虫机器A —> 代理IP机器D/E/F/… —> 网站机器C使用squid:爬虫机器A—>squid(机器B,cache_peer机制管理调度代理D/E/F) —> 网站机器C这样做的好处是爬虫不需要考虑如何加载和选择可用的代理,给squid一个代理列表,可以帮助你按照配置文件的规则管理和调度选择代理。最重要的是,爬虫只需要访问squid的服务端口就可以使用代理!
进一步整合
现在服务已经完成,唯一差的一步是集成:
定时监控代理源网站(30分/1小时都可),解析出所有代理IP,入数据库从数据库中取出所有代理,访问某个固定的网站,找出访问成功的代理,更新数据库可用标记和响应时间从数据库中加载所有可用代理,通过某种算法,根据响应时间计算使用权重和最大使用次数按照squid的cache_peer格式,写入配置文件重新加载squid配置文件,刷新squid下的代理列表爬虫指定squid的服务IP和端口,进行纯粹的爬取操作一个完整的代理服务通过这样的方法就可以搭建完成,定时输出高质量代理。爬虫端不用关心代理的采集和测试,只管使用squid的统一服务入口爬取数据即可。二、怎么用Nginx搭建正向代理上面介绍了使用agent爬行对象的反爬行策略,那么它使用的agent怎么用nginx构建呢?
默认配置编译安装在官网下载最新稳定版本的nginx源代码(需要先安装nginx需要的依赖库)
依赖库安装 rpm -qa | grep zlib //查看是否安装了zlib,其他类推.sudo yum install open SSL-dev//install open SSL
sudo yum install pcre-dev//install pcre
sudo yum install zlib-dev//install zlib
nginx编译--prefix= 指向安装目录。- sbin-path= =指定存储可执行文件的位置。
- modules-path= =指定第三方模块的存储路径。
- conf-path= =指定配置文件存储位置。
-error-log-path =指定错误日志存储位置。
- pid-path= =指定pid文件存储位置。
- lock-path= =指定锁定文件的存储位置。
-user =指定程序运行时的非特权用户。
-group =指定程序运行时的非特权用户组。
-builddir =指向编译目录。
-with-rtsig _ module启用rtsig模块支持。
-with-select _ module支持select module,这是一种轮询处理方法。不建议在高并发环境中使用。它被禁用:-不带-select _ module。
-with-poll _ module启用轮询模块支持,其功能与select相同,不建议在高并发环境中使用。
- with-threads启用线程池支持。
-with-file-AIO支持文件AIO。
-with-http _ SSL _ module启用https支持。
-with-http _ v2 _ module启用ngx_http_v2_module支持。
- with-ipv6支持ipv6。
-with-http _ realip _ module允许从请求头更改客户端的ip地址,默认情况下该请求头是关闭的。
-with-http _ addition _ module启用ngix _ http _ addition _ mdoule支持(作为输出筛选器,分部分响应请求)。
-with-http _ XSLT _ module启用ngx_http_xslt_module支持来过滤XML转换请求。
-with-http _ image _ filter _ mdoule启用ngx_http_image_filter_module支持,默认情况下不启用传输JPEGGIFPNG图片的过滤器,需要安装gd库。
-with-http _ geoip _ module启用ngx_http_geoip_module支持,用于根据MaxMind Geoip二进制文件匹配的客户端IP地址创建ngx_http_geoip_module变量。
-with-http _ sub _ module启用ngx_http_sub_module支持,允许nginx响应中的一些文本被其他一些文本替换。
-with-http _ dav _ module启用ngx_http_dav_module支持,并添加PUT、DELETE、MKCOL创建set、COPY和MOVE方法,这些方法默认情况下是关闭的,需要编译和打开。
-with-http _ flv _ module启用ngx_http_flv_module支持,并提供基于时间的偏移文件来查找内存使用情况。
-with-http _ mp4 _ module启用ngx_http_mp4_module支持,支持mp4视频文件。
-with-http _ g _ static _ module启用ngx_http_g_static_module支持,支持输出数据流在线实时压缩。
-with-http _ random _ index _ module启用ngx_http_random_index_module支持,并从目录中随机选择一个目录索引。
-with-http _ secure _ link _ module启用ngx_http_secure_link_module支持来计算和检查所需的安全链接URL。
-with-http _ declaration _ module enable ngx _ http _ declaration _ module support允许在内存不足的情况下返回204或444个代码。
-with-http _ stub _ status _ module使ngx_http_stub_status_module支持查看nginx的状态页。
-无-http _ charset _ module禁用ngx_http_charset_module,并可以在字符集之间进行转换,从其他字符转换为UTF-8或从UTF8转换为其他字符。只能从服务器到客户端,只能转换一个字节的字符。
-with-http _ g _ module禁用ngx_http_g_module支持,与-with-http _ g _ static _ module函数相同。
-不带-http _ SSI _ module禁用ngx_http_ssi_module支持,并在输入端提供用于处理服务器包含文件(SSI)的过滤器。
-不带-http _ userid _ module禁用对ngx_http_userid_module的支持,该模块用于确定客户端请求的cookies。
-不带-http _ access _ module禁用ngx_http_access_module支持,并提供基于主机ip地址的访问控制功能。
-with-http _ auth _ basic _ module禁用ngx_http_auth_basic_module支持,可以通过用户名和密码验证来验证站点或部分内容。
-with-http _ autoindex _ module禁用ngx_http_authindex_module,该模块用于在ngx_http_index_module找不到索引文件时发送请求,并自动生成目录列表。
-不带-http _ geo _ module禁用ngx_http_geo_module支持,该支持用于根据客户端ip创建变量。
-with-http _ map _ module禁用ngx_http_map_module支持,并使用任意键和值对设置配置变量。
-不带-http _ split _ clients _ module禁用ngx_http_split_clients_module,该模块用于根据用户的ip地址、标头和cookies来划分用户。
-不带-http _ Referer _ module禁用ngx_http_referer_modlue支持,该支持用于过滤标头中引用值不正确的请求。
-不带-http _ rewrite _ module禁用ngx_http_rewrite_module支持。该模块允许使用正则表达式来改变URIs,并根据变量来改变和选择配置。如果在服务器级别设置了此选项,它将在位置之前生效,但是如果位置中有进一步的重写规则,位置中的规则仍将被执行。如果这个URI重写是由位置部分的规则引起的,那么位置部分将作为新的URI被再次执行,并且这个循环将被执行10次,最后将返回500错误。
-不带-http _ proxy _ module禁用ngx_http_proxy_module支持和http代理功能。
-不带-http _ fastcgi _ module禁用ngx_http_fastcgi_module支持,这允许ngix与fastcgi进程交互,并通过传递参数来控制fastcgi进程的工作。
-不带-http _ uwsgi _ module禁用ngx_http_uwsgi_module的支持,该模块用于使用uwsgi协议,与uwsgi服务器相关。
-不带-http _ scgi _ module禁用ngx_http_scgi_module支持,类似于fastcgi,也是应用程序和http服务之间的接口标准。
-不带-http _ memcached _ module禁用ngx_http_memcached支持,以提供简单的缓存并提高系统效率。
-无-http _ limit _ conn _ module禁用对ngx_http_limit_conn_module的支持,可以根据情况限制会话的并发连接数。
-with-http _ limit _ req _ module禁用ngx_limit_req_module支持,这可以限制一个地址的请求数量。
-不带-http _ empty _ gif _ module禁用对ngx_http_empty_gif_module的支持,该模块有一个驻留在内存中的1*1透明gif图像,可以非常快速地调用。
-with-http _ browser _ module禁用ngx_http_browser_mdoule支持,并创建一个依赖于请求头的值。如果浏览器是modern,$modern_browser等于modern_browser_value的值;如果浏览器是旧的,$古风_browser等于$古风_browser_value指令赋予的值;如果浏览器是MSIE,$msie等于1。
-无-http _ upstream _ IP _ hash _ module禁用NGX _ http _ upstream _ IP _ hash _ module支持,用于简单的负载均衡。
-with-http _ perl _ module启用ngx_http_perl_module支持,这使得nginx可以直接使用perl或者通过ssi调用perl。
-with-perl _ modules _ path =-with-perl _ modules _ path =
- with-perl= =设置perl库文件路径
-http-log-path =设置访问日志路径
-http-client-body-temp-path =设置http客户端请求临时文件路径
- http-proxy-temp-path=设置-http-proxy-temp-path =文件路径
-http-fastcgi-temp-path = set-http-fastcgi-temp-path =文件路径
-http-uwsgi-temp-path =设置http scgi临时文件路径
- http-scgi-temp-path=设置-http-scgi-temp-path =文件路径
-不带-http禁用http服务器功能
-不带-http-cache禁用http缓存功能
-通过邮件启用POP3、IMAP4和SMTP代理模块
-with-mail _ SSL _ module启用ngx_mail_ssl_module支持
-不带-mail _ pop3 _ module禁用pop3协议。
-with-mail _ iamp _ module禁用iamp协议。
-不带-mail _ smtp _ module禁用smtp协议。
-with-Google _ perftools _ module启用ngx_google_perftools_mdoule调试支持,可用于分析程序性能瓶颈。
-with-CPP _ test _ module使能ngx_cpp_test_module支持。
- add-module= =指定外部模块路径以支持外部模块。
-with-cc = c编译器的路径。
- with-cpp= =指向c预处理路径。
-with-cc-opt =设置c编译器参数,指定-with-cc-opt = "-I/usr/lcal/include ",如果使用select()函数,还需要指定文件描述符的个数-with-cc-opt = "-d FD _ set size = 2048 "。(PCRE库)
-with-LD-opt =设置连接文件参数,需要指定-with-LD-opt = "-l/usr/local/lib "。(PCRE库)
-with-CPU-opt =指定编译后的CPU类型,如奔腾、奔腾pro、...amd64,ppc64...
-不带-pcre禁用pcre库。
- with-pcre启用pcre库。
- with-pcre= =指向pcre库文件目录。
-with-pcre-opt =在编译时为pcre库设置附加参数。
- with-md5= =指向md5库文件目录。
-with-md5-opt =在编译时为md5库设置附加参数。
-with-md5-ASM使用md5程序集源。
- with-sha1= =指向sha1库文件目录。
-with-sha1-opt =在编译时为sha1库设置附加参数。
-with-sha1-ASM使用sha1组装源代码。
- with-zlib= =指向zlib库文件目录。
-with-zlib-opt =在编译时为zlib设置附加参数。
-with-zlib-ASM =使用指定CPU的程序集源进行优化。
- with-libatomic为实现原子内存更新操作提供了一个框架。
- with-libatomic= =指向libatomic_ops的安装目录。
- with-openssl= =指向openssl安装目录。
- with-openssl-opt=-opt =在编译时为openssl设置附加参数。
- with-debug启用调试日志记录。
nginx安装 tar zxvf nginx -1.10 .3.tar.gzcd nginx -1.10.3
。/configure
做
安装
修改nginx运行配置文件
[默认情况下,nginx安装在/usr/local/nginx/下]
vim/usr/local/nginx/conf/nginx . conf
includemime.types
default _ type application/octet-stream;
# log _ format main ' $ remote _ addr-$ remote _ user[$ time _ local]" $ request "
# ' $ status $ body _ bytes _ send " $ http _ refer " '
# ' " $ http _ user _ agent " " $ http _ x _ forward _ for " ';
# access _ log logs/access . log main;
sendfileon
# tcp _ nopush on
keepalive _ timeout65
# g on
#代理服务设置
服务器{
解析器192 . 168 . 99 . 100;#可用的DNS
listen81#监听端口
位置/
proxy _ pass http://$ http _ host $ request _ uri;
}
}
}
1.《爬虫代理 爬虫、代理和Nginx》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《爬虫代理 爬虫、代理和Nginx》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/790957.html