‘壹’ python下 selenium与chrome结合进行网页爬取,怎么设置代理IP
#coding:utf-8
import sys,re,random,time,os
import socket
from socket import error as socket_error
import threading
import urllib2,cookielib
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.proxy import *
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
proxyFilePath = time.strftime("%Y%m%d")
def testSocket(ip, port):
'''
socket连接测试,用来检测proxy ip,port 是否可以正常连接
'''
print '正在测试socket连接...'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.settimeout(10)
sock.connect((ip, int(port)))
#sock.send('meta')
sock.close()
print ip+':'+port+'--status:ok'
return 1
except socket_error as serr: # connection error
sock.close()
print ip+':'+port+'--status:error--Connection refused.'
return 0
def getDriver(httpProxy = '', type='Firefox'):
if type == 'Firefox':
proxy = Proxy({
'proxyType': ProxyType.MANUAL,
'httpProxy': httpProxy,
'ftpProxy': httpProxy,
'sslProxy': httpProxy,
'noProxy': '' # set this value as desired
})
firefox_profile = FirefoxProfile()
#firefox_profile.add_extension("firefox_extensions/adblock_plus-2.5.1-sm+tb+an+fx.xpi")
firefox_profile.add_extension("firefox_extensions/webdriver_element_locator-1.rev312-fx.xpi")
firefox_profile.set_preference("browser.download.folderList",2)
firefox_profile.set_preference("webdriver.load.strategy", "unstable")
#driver = webdriver.Firefox(firefox_profile = firefox_profile, proxy=proxy, firefox_binary=FirefoxBinary('/usr/bin/firefox'))
#driver = webdriver.Firefox(firefox_profile = firefox_profile, proxy=proxy, firefox_binary=FirefoxBinary("/cygdrive/c/Program\ Files\ (x86)/Mozilla\ Firefox/firefox.exe"))
driver = webdriver.Firefox(firefox_profile = firefox_profile, proxy=proxy)
elif type == 'PhantomJS': # PhantomJS
service_args = [
'--proxy='+httpProxy,
'--proxy-type=http',
]
webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.User-Agent'] = 'Mozilla/5.0 (X11; Windows x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36'
driver = webdriver.PhantomJS(executable_path='windows/phantomjs.exe', service_args=service_args)
else: # Chrome
chrome_options = webdriver.ChromeOptions()
#chrome_options.add_extension('firefox_extensions/adblockplus_1_7_4.crx')
chrome_options.add_argument('--proxy-server=%s' % httpProxy)
driver = webdriver.Chrome(executable_path='windows/chromedriver.exe', chrome_options=chrome_options)
return driver
‘贰’ 如何使用Python实现爬虫代理IP池
第一步:找IP资源
IP资源并不丰富,换句话说是供不应求的,因此一般是使用动态IP。
免费方法,直接在网络上找,在搜索引擎中一搜索特别多能够提供IP资源的网站,进行采集即可。
付费方法,通过购买芝麻ip上的IP资源,并进行提取,搭建IP池。
‘叁’ python随便给了个代理IP居然也能正常访问,这是为啥
不同的状态码代表着不同含义。
200并不代表正常访问并获取到返回值。只是表明正确处理了请求而已。
你随便设置的代理ip有可能真的存在这是一方面,另一方面代理只是链接与转发功能。200的状态码也并不能表示代理成功让你访问到了目标网址并获取到了正确的返回信息。
常见的状态码有很多,404、400、500等等。
以下资料摘自(csdn博客:https://blog.csdn.net/xiaoxiaode_shu/article/details/80700801)
1开头的http状态码
表示临时响应并需要请求者继续执行操作的状态代码。
100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
2开头的http状态码
表示请求成功
200 成功处理了请求,一般情况下都是返回此状态码;
201 请求成功并且服务器创建了新的资源。
202 接受请求但没创建资源;
203 返回另一资源的请求;
204 服务器成功处理了请求,但没有返回任何内容;
205 服务器成功处理了请求,但没有返回任何内容;
206 处理部分请求;
3xx (重定向)
重定向代码,也是常见的代码
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
4开头的http状态码表示请求出错
400 服务器不理解请求的语法。
401 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 服务器拒绝请求。
404 服务器找不到请求的网页。
405 禁用请求中指定的方法。
406 无法使用请求的内容特性响应请求的网页。
407 此状态代码与 401类似,但指定请求者应当授权使用代理。
408 服务器等候请求时发生超时。
409 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 如果请求的资源已永久删除,服务器就会返回此响应。
411 服务器不接受不含有效内容长度标头字段的请求。
412 服务器未满足请求者在请求中设置的其中一个前提条件。
413 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 请求的 URI(通常为网址)过长,服务器无法处理。
415 请求的格式不受请求页面的支持。
416 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 服务器未满足”期望”请求标头字段的要求。
5开头状态码并不常见,但是我们应该知道
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
‘肆’ python 爬虫 ip池怎么做
无论是爬取IP,都能在本地设计动态代理IP池。这样既方便使用,又可以提升工作效率。那么怎么在本地设计一个代理IP池呢?IPIDEA为大家简述本地代理IP池的设计和日常维护。
代理IP获取接口,如果是普通代理IP,使用ProxyGetter接口,从代理源网站抓取最新代理IP;如果是需耗费代理IP,一般都有提供获取IP的API,会有一定的限制,比如每次提取多少个,提取间隔多少秒。
代理IP数据库,用以存放在动态VPS上获取到的代理IP,建议选择SSDB。SSDB的性能很突出,与Redis基本相当了,Redis是内存型,容量问题是弱项,并且内存成本太高,SSDB针对这个弱点,使用硬盘存储,使用Google高性能的存储引擎LevelDB,适合大数据量处理并把性能优化到Redis级别。
代理IP检验计划,代理IP具备时效性,过有效期就会失效,因此 需要去检验有效性。设置一个定时检验计划,检验代理IP有效性,删除无效IP、高延时IP,同时预警,当IP池里的IP少于某个阈值时,根据代理IP获取接口获取新的IP。
代理IP池外部接口除代理拨号服务器获取的代理IP池,还需要设计一个外部接口,通过这个接口调用IP池里的IP给爬虫使用。代理IP池功能比较简单,使用Flask就可以搞定。功能可以是给爬虫提供get/delete/refresh等接口,方便爬虫直接使用。
‘伍’ 代理IP对于Python爬虫有多重要
额~我使用代理IP做爬虫这么久,还没遇到这个问题哎,是不是因为你使用的代理IP可用率不太高导致的啊,或者是你的代理IP实际上并不是高匿的啊,网站根据某些规律找到你的本机IP了。我一直用的是 618IP代理 HTTP,没遇到什么问题,觉得爬取速度很快,也很稳定。建议你用排除法去排除可能导致的原因,快点解决问题
‘陆’ python下 selenium与chrome结合进行网页爬取,怎么设置代理IP
设置代理的话,可以使用这种方式,代码是我刚才测试过的,亲测可用from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://171.37.135.94:8123')
chrome = webdriver.Chrome(chrome_options=chrome_options)
chrome.get('http://httpbin.org/ip')
print(chrome.page_source)
chrome.quit()
不过话说回来,本来用selenium的话抓取速度就很慢了,加上代理的话(如果代理不稳定)可能还会慢出一大截。
‘柒’ python爬虫应该怎样使用代理IP
先网站上在线提取代理IP,提取数量、代理协议、端口位数等都可以自定义
‘捌’ python 如何编写代理服务器
frombottleimportrun,route,request,response
fromurllib.requestimporturlopen
@route('<url:re:.*>')
defget_method(url):
data=urlopen(url)
returndata.read()
run(host='0.0.0.0',port=3456,debug=True)
我简单写一个,使用bottle框架,注意不要该ie的代理,使用别的浏览器如firefox代理到
127.0.0.1:3456
‘玖’ 怎么快速验证代理IP是否可用 只能使用VBA或者python3.7
不知道协议、账号和密码的情况下,只能测试连接是否可用了。
fromconcurrent.,as_completed
importsocket
deftry_connection(ip_port):
s=socket.socket()
s.settimeout(5)
try:
s.connect(ip_port)
exceptsocket.timeoutase:
info=ip_port[0]+':'+str(ip_port[1])+'超时'
exceptsocket.errorase:
info=ip_port[0]+':'+str(ip_port[1])+''+str(e)
else:
info=ip_port[0]+':'+str(ip_port[1])+'可用'
finally:
s.close()
returninfo
executor=ThreadPoolExecutor(max_workers=10)
withopen('server.txt','r')asfin,open('connection.txt','w')asfout:
servers=[]
foraddrinfin:
ip,port=addr.split(':')
port=int(port)
servers.append((ip,port))
forresultinexecutor.map(try_connection,servers):
print(result)
fout.write(result+' ')