url管理器主要用來管理要爬取的url,放置重複爬取
輸出,將解析後的資料輸出儲存起來
以下為**示例:
1.url管理器
#管理要爬取的url2.讀取頁面內容class
urlmanager(object):
def
__init__(self):
#未爬取過的url
self.new_urls = set()
#已爬取到的url
self.old_urls = set()
#新增乙個url list到待爬取集合
def
add_new_urls(self
,urls):
if urls is
none
or len(urls) == 0:
return
for url in urls :
if url not in
self.old_urls :
self.new_urls.add(url)
#新增乙個url到待爬取集合
def
add_new_url(self
,url):
if url is
none:
return
if url not in
self.new_urls and url not in
self.old_urls:
self.new_urls.add(url)
#判斷是否還有為爬取的url
def
has_new_url(self):
return
len(self.new_urls) >0
#從集合中取出乙個要爬取的url
def
get_new_url(self):
new_url = self.new_urls.pop()
self.old_urls.add(new_url)
return new_url
import urllib23.解析內容#使用python自帶的urllib2獲取爬取頁面的內容
class
html**********:
def
download(self
,url):
if url is
none:
return
none
response = urllib2.urlopen(url)
if response.getcode() != 200 :
return
none
return response.read()
from bs4 import beautifulsoup4.輸出import re
import urlparse
class
htmlparser:
#將爬取到的內容中的所有url新增到待爬取集合中
def
_get_new_urls(self
,url,soup):
new_urls = set()
#只取出/item開頭的url
links = soup.find_all('a'
,href=re.compile(r"/item"))
for link in links :
new_url = link['href']
#將new_url按照傳入的url格式補齊
new_full_url = urlparse.urljoin(url,new_url)
new_urls.add(new_full_url)
return new_urls
#提取出需要的資料,表頭,簡介
def
_get_new_data(self
,url,soup):
res_data = {}
res_data['url'] = url
##title_node = soup.find('dd'
,class_="lemmawgt-lemmatitle-title").find('h1')
res_data['title'] = title_node.get_text()
#summary_node = soup.find('div'
,class_='lemma-summary')
res_data['summary'] = summary_node.get_text()
return res_data
#使用beautifulsoup將html內容解析成dom樹
def
parse(self
,url,html_cont):
if url is
none
or html_cont is
none:
return
soup = beautifulsoup(html_cont,
'html.parser'
,from_encoding='utf-8')
new_urls = self._get_new_urls(url,soup)
new_data = self._get_new_data(url,soup)
return new_urls,new_data
#coding:utf85.入口class
htmloutputer:
def
__init__(self):
self.datas =
def
collect_data(self
,data):
if data is
none:
return
def
output_html(self):
fout = open('output.html'
,'w')
fout.write('')
fout.write('')
fout.write('')
for data in
self.datas:
fout.write('')
fout.write('%s'%data['url'].encode('utf-8'))
fout.write('%s' % data['title'].encode('utf-8'))
fout.write('%s%r' % (data['summary'].encode('utf-8') ,
'/n'))
fout.write('')
fout.write('')
fout.write('')
fout.write('')
#coding:utf86.執行結果:from baike_spider import url_mananger,html_**********,html_outputer,html_parser
class
spidermain() :
def
__init__(self):
self.urls = url_mananger.urlmanager()
self.********** = html_**********.html**********()
self.parse = html_parser.htmlparser()
self.outputer = html_outputer.htmloutputer()
def
craw(self
,root_url):
count = 1
self.urls.add_new_url(root_url)
while
self.urls.has_new_url():
try:
new_url = self.urls.get_new_url()
'craw %d : %s' %(count,new_url)
html_cont = self.**********.download(new_url)
new_urls,new_data = self.parse.parse(new_url,html_cont)
self.urls.add_new_urls(new_urls)
self.outputer.collect_data(new_data)
count +=1
if count == 1000:
break
except
exception
, e:
print e.message
'craw failed'
self.outputer.output_html()
if __name__ == '__main__' :
root_url = ""
obj_spider = spidermain()
obj_spider.craw(root_url)
urllib2使用總結
urllib2庫是涉及到url資源請求的常用庫 官方文件 urllib2 extensible library for opening urls 常用函式 urllib2.urlopen url data timeout cafile capath cadefault context url 可以是...
urllib2使用總結
urllib2是python的乙個獲取urls的元件。他以urlopen函式的形式提供了乙個非常簡單的介面,具有利用不同協議獲取urls的能力,同樣提供了乙個比較複雜的介面來處理一般情況。urllib2支援獲取不同格式的urls例如 ftp gopher等,並利用它們相關網路協議進行獲取。urlli...
urllib2使用初探
在入門urllib2之前,我想應該先調研一下urllib與urllib2的區別 1 首先我們要明白的是,這兩個模組不可以相互替代.兩者都是接受url請求的模組,但是提供了不同的功能,兩個顯著的區別是 1.對於乙個url的request,urllib2.urlopen可以接受乙個request類的例項...