2013-11-23 2 views
1

Я пытаюсь использовать Scrapy with Selenium, чтобы очистить страницу с динамически созданным содержимым javascript (http://huati.weibo.com). Я постоянно получаю отказ от соединения, но я не уверен, что он что-то делает или сам сервер (который находится в Китае, поэтому существует возможность какой-то проблемы с брандмауэром?).Связь отказалась при использовании Scrapy with Selenium

Что я получаю:

Traceback (most recent call last): 
    File "/usr/local/bin/scrapy", line 4, in <module> 
    execute() 
    File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 142, in execute 
    _run_print_help(parser, _run_command, cmd, args, opts) 
    File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 88, in _run_print_help 
    func(*a, **kw) 
    File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 149, in _run_command 
    cmd.run(args, opts) 
    File "/usr/local/lib/python2.7/dist-packages/scrapy/commands/crawl.py", line 48, in run 
    spider = crawler.spiders.create(spname, **opts.spargs) 
    File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermanager.py", line 48, in create 
    return spcls(**spider_kwargs) 
    File "/opt/bitnami/apps/wordpress/htdocs/data/sina_crawler/sina_crawler/spiders/sspider.py", line 18, in __init__ 
    self.selenium.start() 
    File "/usr/local/lib/python2.7/dist-packages/selenium/selenium.py", line 197, in start 
    result = self.get_string("getNewBrowserSession", start_args) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/selenium.py", line 231, in get_string 
    result = self.do_command(verb, args) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/selenium.py", line 220, in do_command 
    conn.request("POST", "/selenium-server/driver/", body, headers) 
    File "/usr/lib/python2.7/httplib.py", line 958, in request 
    self._send_request(method, url, body, headers) 
    File "/usr/lib/python2.7/httplib.py", line 992, in _send_request 
    self.endheaders(body) 
    File "/usr/lib/python2.7/httplib.py", line 954, in endheaders 
    self._send_output(message_body) 
    File "/usr/lib/python2.7/httplib.py", line 814, in _send_output 
    self.send(msg) 
    File "/usr/lib/python2.7/httplib.py", line 776, in send 
    self.connect() 
    File "/usr/lib/python2.7/httplib.py", line 757, in connect 
    self.timeout, self.source_address) 
    File "/usr/lib/python2.7/socket.py", line 571, in create_connection 
    raise err 
socket.error: [Errno 111] Connection refused 
Exception socket.error: error(111, 'Connection refused') in <bound method SeleniumSpider.__del__ of <SeleniumSpider 'SeleniumSpider' at 0x1e246d0>> ignored 

Мой код:

1 from scrapy.contrib.spiders import CrawlSpider, Rule 
    2 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
    3 from scrapy.selector import HtmlXPathSelector 
    4 from scrapy.http import Request 
    5 
    6 from selenium import selenium 
    7 
    8 
    9 class SeleniumSpider(CrawlSpider): 
10   name = "SeleniumSpider" 
11   allowed_domains = ["weibo.com"] 
12   start_urls = ["http://huati.weibo.com/"] 
13 
14   def __init__(self): 
15    CrawlSpider.__init__(self) 
16    self.verificationErrors = [] 
17    self.selenium = selenium("localhost", 4444, "*firefox", "http://huati.weibo.com") 
18    self.selenium.start() 
19 
20   def __del__(self): 
21    self.selenium.stop() 
22    print self.verificationErrors 
23    CrawlSpider.__del__(self) 
24 
25   def parse(self, response): 
26    hxs = HtmlXPathSelector(response) 
27 
28    sel = self.selenium 
29    sel.open(response.url) 
30 
31    time.sleep(2.5) 
32 
33    sites = sel.get_text('//html/body/div/div/div/div/div/div/div/div[@class="interest_topicR"]') 
34    print sites 

Для справки я после этого образца кода: http://snipplr.com/view/66998/

ответ

0

То есть, скорее всего, поведение на стороне сервера , Вы попали на их сайт с большим количеством запросов? Я просто получил страницу без проблем с urllib (без JavaScript явно), поэтому я сомневаюсь, что они используют сложные методы для обнаружения ботов.

Я предполагаю, что вы сделали слишком много запросов за короткий период времени. Мой способ справиться с этим - поймать ConnectionError, а затем использовать time.sleep(600) для отдыха на некоторое время. Затем повторите попытку подключения. Вы также можете подсчитать количество забросов ConnectionError и сдаться после 4 или 5 попыток. Это выглядит примерно так:

def parse(url, retry=0, max_retry=5): 
    try: 
     req = sel.open(url) 
    except ConnectionError: 
     if retry > max_retry: break 
     logging.error('Connection error, resting...') 
     time.sleep(100) 
     self.parse(url, retry+1, max_retry) 
+0

Я тоже думал, что это серверная сторона, но я теперь совершенно уверен, что это проблема с моим кодом. Все еще в тупик, где. Я почти уверен, что это не из-за того, что слишком много запросов с их сайта, так как я только запустил spider в 15 раз, и в настоящее время скрипт загружает только одну страницу один раз. – user3025245

Смежные вопросы