0

我正在使用urllib2inPython来抓取网页。但是,该read()方法不会返回。

这是我正在使用的代码:

import urllib2

url = 'http://edmonton.en.craigslist.ca/kid/'

headers = {'User-Agent': 'Mozilla/5.0'}
request = urllib2.Request(url, headers=headers)
f_webpage = urllib2.urlopen(request)
html = f_webpage.read()  # <- does not return

我上一次运行脚本是在一个月前,当时它运行良好。

请注意,相同的脚本对于 Edmonton Craigslist 上其他类别的网页运行良好,例如http://edmonton.en.craigslist.ca/act/http://edmonton.en.craigslist.ca/eve/.

4

3 回答 3

1

根据评论中的要求:)

安装requests方式$ pip install requests

使用requests如下:

>>> import requests
>>> url = 'http://edmonton.en.craigslist.ca/kid/'
>>> headers = {'User-Agent': 'Mozilla/5.0'}
>>> request = requests.get(url, headers=headers)
>>> request.ok
True
>>> request.text  # content in string, similar to .read() in question
...
...

免责声明:从技术上讲,这不是 OP 问题的答案,而是解决了 OP 的问题,因为urllib2已知存在问题,requests图书馆就是为解决此类问题而诞生的。

于 2013-07-21T22:24:01.723 回答
0

它返回(或更具体地说,错误输出)对我来说很好:

>>> import urllib2
>>> url = 'http://edmonton.en.craigslist.ca/kid/'
>>> headers = {'User-Agent': 'Mozilla/5.0'}
>>> request = urllib2.Request(url, headers=headers)
>>> f_webpage = urllib2.urlopen(request)
>>> html = f_webpage.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/socket.py", line 351, in read
    data = self._sock.recv(rbufsize)
  File "/usr/lib/python2.7/httplib.py", line 541, in read
    return self._read_chunked(amt)
  File "/usr/lib/python2.7/httplib.py", line 592, in _read_chunked
    value.append(self._safe_read(amt))
  File "/usr/lib/python2.7/httplib.py", line 647, in _safe_read
    chunk = self.fp.read(min(amt, MAXAMOUNT))
  File "/usr/lib/python2.7/socket.py", line 380, in read
    data = self._sock.recv(left)
socket.error: [Errno 104] Connection reset by peer

很可能 Craigslist 检测到您是爬虫并拒绝为您提供实际页面。

于 2013-07-19T02:18:36.593 回答
0

我和你遇到了类似的问题。我的部分错误信息:

File "C:\Python27\lib\socket.py", line 380, in read
data = self._sock.recv(left)

File "C:\Python27\lib\httplib.py", line 573, in read
s = self.fp.read(amt)

File "C:\Python27\lib\socket.py", line 380, in read
data = self._sock.recv(left)

error: [Errno 10054] 

我通过小批量读取缓冲区而不是直接读取来解决它。

def readBuf(fsrc, length=16*1024):
    result=''
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        else:
            result+=buf
    return result

html=f_webpage.read()您可以使用html=readBuf(f_webpage)来抓取网页,而不是使用。

于 2015-12-30T10:02:52.860 回答