【python】一个简单的贪婪爬虫
生活随笔
收集整理的這篇文章主要介紹了
【python】一个简单的贪婪爬虫
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這個(gè)爬蟲的作用是,對(duì)于一個(gè)給定的url,查找頁面里面所有的url連接并依次貪婪爬取
?
主要需要注意的地方:
1.lxml.html.iterlinks() ?可以實(shí)現(xiàn)對(duì)頁面所有url的查找
2.獲取頁面要設(shè)置超時(shí),否則遇到?jīng)]有響應(yīng)的頁面,代碼容易卡死
3.對(duì)所有異常的捕獲
4.廣度優(yōu)先搜索實(shí)現(xiàn)
?
具體代碼如下:
#!/usr/bin/env python #encoding:utf8#這是一個(gè)爬蟲代碼,從初始url頁面中查找所有的url并根據(jù)廣度優(yōu)先的順序依次貪婪爬取 #爬取的頁面以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 #要獲取的頁面數(shù)self.urls = ["http://www.cnblogs.com/"] #初始urlself.html_num = 13047 #當(dāng)前存儲(chǔ)的是第幾個(gè)頁面self.url_num = 0 #當(dāng)前要爬取的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) #要設(shè)置timeout,有時(shí)頁面長時(shí)間無法響應(yīng)不加timeout會(huì)導(dǎo)致程序卡死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: #對(duì)于所有異常形式,都返回空內(nèi)容return ''def getUrl(self, content):try:print "getUrl"html = lxml.html.fromstring(content)links = lxml.html.iterlinks(html) #這個(gè)函數(shù)可以自動(dòng)獲取頁面中的所有url,非常好用urls = []for link in links:if "http" in link[2]:urls.append(link[2])return urlsexcept Exception, ex:return []def scrawl(self): #廣度優(yōu)先爬取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: #對(duì)于已經(jīng)爬取過的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()
?
總結(jié)
以上是生活随笔為你收集整理的【python】一个简单的贪婪爬虫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何改变Myeclipse编辑区背景色
- 下一篇: 线程间通讯