Решил, что далее изучать Scrapy нужно с RandomProxy (найти ошибки, о которых я написал месяц назад), решил в этом посте все распечатать. А в следующем уже экспериментировать...
Итак, я добавил два файла (list.txt randomproxy.py) в провереный пример dirbot¶
In [1]:
!ls /media/usb0/w8/GitHub/dirbot_se1
In [2]:
!ls /media/usb0/w8/GitHub/dirbot_se1/dirbot
In [4]:
%load /media/usb0/w8/GitHub/dirbot_se1/dirbot/settings.py
In [9]:
# Scrapy settings for dirbot project
SPIDER_MODULES = ['dirbot.spiders']
NEWSPIDER_MODULE = 'dirbot.spiders'
DEFAULT_ITEM_CLASS = 'dirbot.items.Website'
ITEM_PIPELINES = ['dirbot.pipelines.FilterWordsPipeline']
##############################################
#import pdb; pdb.set_trace()
# Retry many times since proxies often fail
RETRY_TIMES = 10
# Retry on most error codes since proxies fail for different reasons
RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408]
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 90,
# Fix path to this module
'dirbot.randomproxy.RandomProxy': 100,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
}
# Proxy list containing entries like
# http://host1:port
# http://username:password@host2:port
# http://host3:port
# ...
PROXY_LIST = 'dirbot/list.txt'
In [5]:
%load /media/usb0/w8/GitHub/dirbot_se1/dirbot/randomproxy.py
In []:
import re
import random
import base64
from scrapy import log
# debugger
import pdb
class RandomProxy(object):
def __init__(self, settings):
self.proxy_list = settings.get('PROXY_LIST')
fin = open(self.proxy_list)
self.proxies = {}
for line in fin.readlines():
parts = re.match('(\w+://)(\w+:\w+@)?(.+)', line)
pdb.set_trace()
# Cut trailing @
if parts[1]:
parts[1] = parts[1][:-1]
self.proxies[parts[0] + parts[2]] = parts[1]
fin.close()
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings)
def process_request(self, request, spider):
# Don't overwrite with a random one (server-side state for IP)
if 'proxy' in request.meta:
return
proxy_address = random.choice(self.proxies.keys())
proxy_user_pass = self.proxies[proxy_address]
request.meta['proxy'] = proxy_address
if proxy_user_pass:
basic_auth = 'Basic ' + base64.encodestring(proxy_user_pass)
request.headers['Proxy-Authorization'] = basic_auth
def process_exception(self, request, exception, spider):
proxy = request.meta['proxy']
log.msg('Removing failed proxy <%s>, %d proxies left' % (
proxy, len(self.proxies)))
try:
del self.proxies[proxy]
except ValueError:
pass
In [6]:
%load /media/usb0/w8/GitHub/dirbot_se1/dirbot/list.txt
In []:
http://94.180.118.34:8080
http://213.141.146.146:8080
http://218.108.232.93:80
http://54.85.145.16:3128
Пробуем все куски кода последователно¶
In []:
# Выполняем код в ячейке 9 (там все константы)
In [10]:
proxy_list = settings.get('PROXY_LIST')
proxy_list
Да, действительно обекта settings нет, мы ведь не запустили Scrapy, как это положено..., попробуем просто занрузить файл со списком прокси
In [18]:
import re
import random
import base64
from scrapy import log
# debugger
import pdb
In [72]:
fin = open('/media/usb0/w8/GitHub/dirbot_se1/dirbot/list.txt')
In [28]:
l= fin.readline()
l
Out[28]:
Просто нет доступа к файлу, потом скопируем его папку проекта и откроем. А что там в конце строки? - это сочетание из Windows (файл я сделал там).
In [94]:
fin = open('../scrapy-proxies-master/list.txt')
In [30]:
fin.readline()
Out[30]:
In [37]:
for line in fin.readlines():
print line
In [93]:
fin.close()
In [15]:
proxies = {}
In [95]:
rl=fin.readlines()
In []:
rl.
In [96]:
for line in rl:
parts = re.match('(\w+://)(\w+:\w+@)?(.+)', line)
proxies = parts.groups()
In []:
#print "From - 0 - %s we cut " % parts.group(0)
#print '0 -',parts.group(0),'1 -', parts.group(1),'2 -',parts.group(2),"***", line
In [97]:
proxies
Out[97]:
In [31]:
for line in fin.readlines():
print fin.readline
parts = re.match('(\w+://)(\w+:\w+@)?(.+)', line)
print line
# Cut trailing @
if parts[1]:
print parts[1]
parts[1] = parts[1][:-1]
print parts[1]
proxies[parts[0] + parts[2]] = parts[1]
print parts
Кака менять прокси в Scrapy (самая суть) Еще один совет
In []:
#Start your middleware class
class ProxyMiddleware(object):
# overwrite process request
def process_request(self, request, spider):
# Set the location of the proxy
request.meta['proxy'] = "http://123.456.789.012"
# Use the following lines if your proxy requires authentication
proxy_user_pass = "USER_AND_PASS"
# setup basic authentication for the proxy
encoded_user_pass = base64.encodestring(proxy_user_pass)
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий