为什么连接被拒绝?

4

我正在创建一个网络爬取脚本,并将其分为四个部分。单独使用它们都可以完美地工作,但是当我将它们全部组合在一起时,会出现以下错误:urlopen error [Errno 111] Connection refused。我已经查看了类似于我的问题并尝试使用try-except捕获错误,但即使这样也无法解决问题。我的整合代码如下:

from selenium import webdriver
import re
import urllib2
site = ""

def phone():
    global site
    site = "https://www." + site
    if "spokeo" in site:
        browser = webdriver.Firefox()
        browser.get(site)
        content = browser.page_source
        browser.quit()
        m_obj = re.search(r"(\(\d{3}\)\s\d{3}-\*{4})", content)
        if m_obj:    
            print m_obj.group(0)    
    elif "addresses" in site:
        usock = urllib2.urlopen(site)
        data = usock.read()
        usock.close()
        m_obj = re.search(r"(\(\d{3}\)\s\d{3}-\d{4})", data)
        if m_obj:    
            print m_obj.group(0)
    else :
        usock = urllib2.urlopen(site)
        data = usock.read()
        usock.close()
        m_obj = re.search(r"(\d{3}-\s\d{3}-\d{4})", data)
        if m_obj:    
            print m_obj.group(0)

def pipl():
    global site
    url = "https://pipl.com/search/?q=tom+jones&l=Phoenix%2C+AZ%2C+US&sloc=US|AZ|Phoenix&in=6"
    usock = urllib2.urlopen(url)
    data = usock.read()
    usock.close()
    r_list = [#re.compile("spokeo.com/[^\s]+"),
             re.compile("addresses.com/[^\s]+"),
             re.compile("10digits.us/[^\s]+")]
    for r in r_list:
        match = re.findall(r,data)
        for site in match:
            site = site[:-6]
            print site
            phone()

pipl()

这是我的回溯信息:

Traceback (most recent call last):
  File "/home/lazarov/.spyder2/.temp.py", line 48, in <module>
    pipl()
  File "/home/lazarov/.spyder2/.temp.py", line 46, in pipl
    phone()
  File "/home/lazarov/.spyder2/.temp.py", line 25, in phone
    usock = urllib2.urlopen(site)
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 111] Connection refused>

手动调试代码后,我发现错误是来自phone()函数,因此我尝试运行这一部分:
import re
import urllib2
url = 'http://www.10digits.us/n/Tom_Jones/Phoenix_AZ/1fe293a0b7'
usock = urllib2.urlopen(url)
data = usock.read()
usock.close()
m_obj = re.search(r"(\d{3}-\d{3}-\d{4})", data)
if m_obj:
    print m_obj.group(0)

它成功了。我相信这表明防火墙并没有积极地拒绝连接,另一端的服务也没有未启动或过载。任何帮助将不胜感激。


2
附注:DRY(不要重复自己) - alko
1
附注:全局变量是不好的 - James Mills
1个回答

8
通常细节决定成败。
根据您的追溯信息...
File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
return self.do_open(httplib.HTTPSConnection, req)

并且你的源代码...

site = "https://www." + site

我可以假设,您的代码尝试访问 https://www.10digits.us/n/Tom_Jones/Phoenix_AZ/1fe293a0b7,而在测试中,您连接到 http://www.10digits.us/n/Tom_Jones/Phoenix_AZ/1fe293a0b7
请尝试用 http 替换 https(至少对于 www.10digits.us):可能您正在尝试爬取的网站 不响应端口443,只响应端口80(您甚至可以用浏览器检查)。

当我尝试时,收到了以下信息:HTTP错误503:服务暂时不可用。然而,当同样的片段单独存在时,它可以正常工作,这让我怀疑是Web服务器无法处理HTTP请求。 - Peter Lazarov
有没有一种方法可以检查是否是这种情况,如果是真的就加以处理。 - Peter Lazarov
如果收到HTTP错误503(可以使用try..except),则停止5秒钟(import time; time.sleep(5))。要捕获错误,可以查看http://docs.python.org/2/howto/urllib2.html#error-codes(本段末尾有完整示例)。 - furins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接