python - 为什么连接被拒绝?

标签 python networking https web-scraping urllib2

我正在创建一个网络抓取脚本并将其分为四个部分。分别地,它们都工作得很好,但是当我把它们放在一起时,我得到以下错误: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)

它奏效了。我认为,这表明这并不是防火墙主动拒绝连接或相应服务未在其他站点上启动或过载。我们将不胜感激。

最佳答案

通常细节决定成败。

根据你的回溯...

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

尝试将 https 替换为 http(至少对于 www.10digits.us):可能是您要抓取的网站does not respond to the port 443 but only to the port 80 (你甚至可以用你的浏览器检查它)

关于python - 为什么连接被拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21081544/

相关文章:

iphone - 通过 UDP 从服务器向 iPhone 发送大量实时处理的数据

sockets - 套接字编程中的套接字与端口有何不同?

asp.net - https 能否回退到 http 和 https 的安全级别

javascript - 通过 HTTPS 的 Ajax GET 请求

python - 无限滚动条不适用于 django

Python去除重复的名字

python - 如何在 PyQt5 中为任何小部件设置固定大小而不会在调整大小时破坏布局

networking - 这个哈夫曼表是如何创建的?

ruby - 在 Linux 上的 Ruby 中使用 Net::HTTP 的 sslv3 警报非法参数

python - Python 中的基本多态性混淆