支持代理的多线程爬虫Python库?
有没有人知道除了urllib之外,还有什么更高效的工具可以快速、多线程地下载网址,并且能通过http代理工作?我知道有一些,比如Twisted、Scrapy、libcurl等等,但我对它们了解不够,无法做出选择,也不确定它们是否能使用代理。有没有人能推荐一个最适合我需求的工具?谢谢!
2 个回答
1
通常,代理服务器会根据网站的类型来过滤网站。这意味着它们会根据网站是怎么制作的来决定是否允许访问。比如,YouTube 被归类为音频/视频流,所以在一些地方,特别是学校,YouTube 是被屏蔽的。
如果你想绕过这些代理服务器,从一个网站获取数据,并把这些数据放到你自己真正的网站上,比如一个可以注册的.com网站,你可以这样做。
在你创建和注册这个网站的时候,可以把你的网站分类为任何你想要的类型。
17
在Python中实现这个功能很简单。
urlopen()这个函数可以直接和不需要认证的代理服务器一起使用。在Unix或Windows环境下,你需要在启动Python解释器之前,设置http_proxy、ftp_proxy或gopher_proxy这些环境变量,值为你代理服务器的URL。
# -*- coding: utf-8 -*-
import sys
from urllib import urlopen
from BeautifulSoup import BeautifulSoup
from Queue import Queue, Empty
from threading import Thread
visited = set()
queue = Queue()
def get_parser(host, root, charset):
def parse():
try:
while True:
url = queue.get_nowait()
try:
content = urlopen(url).read().decode(charset)
except UnicodeDecodeError:
continue
for link in BeautifulSoup(content).findAll('a'):
try:
href = link['href']
except KeyError:
continue
if not href.startswith('http://'):
href = 'http://%s%s' % (host, href)
if not href.startswith('http://%s%s' % (host, root)):
continue
if href not in visited:
visited.add(href)
queue.put(href)
print href
except Empty:
pass
return parse
if __name__ == '__main__':
host, root, charset = sys.argv[1:]
parser = get_parser(host, root, charset)
queue.put('http://%s%s' % (host, root))
workers = []
for i in range(5):
worker = Thread(target=parser)
worker.start()
workers.append(worker)
for worker in workers:
worker.join()