我正在研究用Python制作的网络爬虫,我偶然发现了一个非常简单的爬虫。但是,我不明白最后几行,在下面的代码中突出显示:
import sys
import re
import urllib2
import urlparse
tocrawl = [sys.argv[1]]
crawled = []
keywordregex = re.compile('<meta\sname=["\']keywords["\']\scontent=["\'](.*?)["\']\s/>')
linkregex = re.compile('<a\s(?:.*?\s)*?href=[\'"](.*?)[\'"].*?>')
while 1:
crawling = tocrawl.pop(0)
response = urllib2.urlopen(crawling)
msg = response.read()
keywordlist = keywordregex.findall(msg)
crawled.append(crawling)
links = linkregex.findall(msg)
url = urlparse.urlparse(crawling)
a = (links.pop(0) for _ in range(len(links))) //What does this do?
for link in a:
if link.startswith('/'):
link = 'http://' + url[1] + link
elif link.startswith('#'):
link = 'http://' + url[1] + url[2] + link
elif not link.startswith('http'):
link = 'http://' + url[1] + '/' + link
if link not in crawled:
tocrawl.append(link)
这句话在我看来像是某种列表理解,但我不确定,我需要一个解释。在
它创建一个生成器,将对象从链接列表中删除。在
解释:
range(len(links))
返回从0到链接列表长度(但不包括)的数字列表。因此,如果链接包含[ "www.yahoo.com", "www.google.com", "www.python.org" ]
,那么它将生成一个列表[0,1,2]。在for _ in blah
,只需循环列表,丢弃结果。在links.pop(0)
从链接中删除第一项。在从一个表达式的头部返回一个链接。在
最后,在python控制台中演示:
它是一个generator expression,当您迭代列表时,它会清空列表
links
。在他们本可以换掉这个零件的
有了这个:
^{pr2}$它也会起到同样的作用。但是,由于从列表的末尾跳出来更有效,所以这比两种方法都要好:
{如果后面的链接不是按顺序排列的话,为什么不按顺序处理呢。在
也可以写成:
^{pr2}$编辑:
唯一的区别是,当使用生成器时,它是懒洋洋地完成的,因此只有当通过a请求时,项目才会从链接中弹出。而不是一次弹出,当处理大量数据时,它的效率要高得多,如果不使用高级python函数,则无法做到这一点。在
相关问题 更多 >
编程相关推荐