【python】一个简单的贪婪爬虫
生活随笔
收集整理的這篇文章主要介紹了
【python】一个简单的贪婪爬虫
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個爬蟲的作用是,對于一個給定的url,查找頁面里面所有的url連接并依次貪婪爬取
?
主要需要注意的地方:
1.lxml.html.iterlinks() ?可以實現對頁面所有url的查找
2.獲取頁面要設置超時,否則遇到沒有響應的頁面,代碼容易卡死
3.對所有異常的捕獲
4.廣度優先搜索實現
?
具體代碼如下:
#!/usr/bin/env python #encoding:utf8#這是一個爬蟲代碼,從初始url頁面中查找所有的url并根據廣度優先的順序依次貪婪爬取 #爬取的頁面以1.html,2.html...的方式命名#author:匡子語
import re import time import lxml.html import urllib2 from collections import dequeclass ScrawURL:def __init__(self):self.total = 50000 #要獲取的頁面數self.urls = ["http://www.cnblogs.com/"] #初始urlself.html_num = 13047 #當前存儲的是第幾個頁面self.url_num = 0 #當前要爬取的url在urls中的位置def getHtml(self, url):print "url:%s" % urluser_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = { 'User-Agent' : user_agent }try:request = urllib2.Request(url, headers = headers)response = urllib2.urlopen(request, timeout=5) #要設置timeout,有時頁面長時間無法響應不加timeout會導致程序卡死content = response.read()self.html_num += 1name = "htmls/%d.html" % self.html_numwith open(name, "w") as f:f.write(content)print self.html_numreturn contentexcept urllib2.HTTPError, e:return ''except urllib2.URLError, e:return ''except Exception, ex: #對于所有異常形式,都返回空內容return ''def getUrl(self, content):try:print "getUrl"html = lxml.html.fromstring(content)links = lxml.html.iterlinks(html) #這個函數可以自動獲取頁面中的所有url,非常好用urls = []for link in links:if "http" in link[2]:urls.append(link[2])return urlsexcept Exception, ex:return []def scrawl(self): #廣度優先爬取print "scrawl"while len(self.urls) < self.total and len(self.urls) > self.url_num: #獲取足夠的urlurl = self.urls[self.url_num]self.url_num += 1content = self.getHtml(url)if content:urls = self.getUrl(content)if urls:for url in urls:if url not in self.urls: #對于已經爬取過的url跳過 self.urls.append(url)while self.html_num < self.total and len(self.urls) > 0: #獲取足夠的頁面url = self.urls[self.url_num]self.url_num += 1self.getHtml(url)if __name__ == "__main__":surl = ScrawURL()surl.scrawl()
?
總結
以上是生活随笔為你收集整理的【python】一个简单的贪婪爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何改变Myeclipse编辑区背景色
- 下一篇: 线程间通讯