Поиск по блогу

среда, 21 мая 2014 г.

Здесь распечатаны файлы к RandomProxy с пауком dmoz

Решил, что далее изучать Scrapy нужно с RandomProxy (найти ошибки, о которых я написал месяц назад), решил в этом посте все распечатать. А в следующем уже экспериментировать...

Итак, я добавил два файла (list.txt randomproxy.py) в провереный пример dirbot

In [1]:
!ls /media/usb0/w8/GitHub/dirbot_se1
dirbot README.rst  scrapy.cfg setup.py


In [2]:
!ls /media/usb0/w8/GitHub/dirbot_se1/dirbot
__init__.py   items.pyc     pipelines.pyc    settings.py

__init__.pyc  list.txt     randomproxy.py   settings.pyc

items.py      pipelines.py  randomproxy.pyc  spiders


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 
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-65a2e2c47efe> in <module>()
----> 1 proxy_list = settings.get('PROXY_LIST')
      2 proxy_list

NameError: name 'settings' is not defined
Да, действительно обекта 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]:
'http://94.180.118.34:8080\r\n'
In [37]:
for line in fin.readlines():
         print line
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 [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]:
('http://', None, '54.85.145.16:3128')
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
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-31-92ad3e84dd0c> in <module>()
      4          print line
      5          # Cut trailing @
----> 6          if parts[1]:
      7             print  parts[1]
      8             parts[1] = parts[1][:-1]

TypeError: '_sre.SRE_Match' object has no attribute '__getitem__'
<built-in method readline of file object at 0xa481d88>
http://213.141.146.146:8080



Кака менять прокси в 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


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий