我正在自学Python并想出了一个简单的web爬虫引擎。代码如下
def find_next_url(page):
start_of_url_line = page.find('<a href')
if start_of_url_line == -1:
return None, 0
else:
start_of_url = page.find('"http', start_of_url_line)
if start_of_url == -1:
return None, 0
else:
end_of_url = page.find('"', start_of_url + 1)
one_url = page[start_of_url + 1 : end_of_url]
return one_url, end_of_url
def get_all_url(page):
p = []
while True:
url, end_pos = find_next_url(page)
if url:
p.append(url)
page = page[end_pos + 1 : ]
else:
break
return p
def union(a, b):
for e in b:
if e not in a:
a.append(e)
return a
def webcrawl(seed):
tocrawl = [seed]
crawled = []
while True:
page = tocrawl.pop()
if page not in crawled:
import urllib.request
intpage = urllib.request.urlopen(page).read()
openpage = str(intpage)
union(tocrawl, get_all_url(openpage))
crawled.append(page)
return crawled
但是我总是收到HTTP403错误。在
您可能需要添加请求头或其他身份验证。 尝试添加用户代理,以避免在某些情况下重述。在
示例:
正如其他人所说,错误不是由代码本身引起的,但是您可能需要尝试做一些事情
如果不这样做的话,请确保爬行程序在添加异常时会出现问题:
尝试在请求中添加一个
User-Agent
头。来自urllib.request docs:因此,类似这样的方法可能有助于避免403个错误:
^{pr2}$HTTP 403错误与您的代码无关。这意味着被爬网的网址被禁止访问。大多数情况下,这意味着页面只对登录用户或特定用户可用。在
我实际上运行了你的代码,得到了403个creativecommons链接。原因是urllib默认情况下不发送
Host
头,您应该手动添加它以避免出现错误(大多数服务器将检查Host
报头并决定它们应该提供哪些内容)。您还可以使用Requests python package代替默认情况下发送Host
头的内置urllib,它在IMO中更像python我添加了一个try exept子句来捕获和记录错误,然后继续爬网其他链接。网上有很多断开的链接。在
相关问题 更多 >
编程相关推荐