目標是爬一下這個網站上點一些句子http://www.duanwenxue.com/
但是由於效果不是很好,剛入門。其實可以根據所有的連接,進行任意跳轉,但現在只是根據某一塊跟正則匹配的地方
的連接來獲取跳轉連接。具體看圖
下面上代碼,初學者求指導:
# -*- coding: utf-8 -*-
import urllib2
import urllib
import re
import threading
import time
import Queue
class Wenxue_Spider_Model(threading.Thread):
"id在set裏面,不作任何處理,不在set裏面,則put到queue後,add到set裏面"
def __init__(self,queue,firstSourceId,sett,count):
self.ok = False
self.firstSourceId=firstSourceId
self.myqueue = queue
self.sett = sett
self.count = count
self.first_page_url = "http://www.duanwenxue.com/article/307683.html"
threading.Thread.__init__(self)
def getHtml(self,url):
webPage=urllib.urlopen(url)
html=webPage.read()
webPage.close()
return html
def processContent(self,content):
"去掉內容裏面HTML標籤"
re_h=re.compile('</?\w+[^>]*>')
content=re_h.sub('',content)
return content
def getSourceId(self,url):
"從一個連接裏獲取到文章的id"
re_id='.*/article/(.*?)\.html'
sourceId = re.compile(re_id).findall(url)
#print type(sourceId),"---"
return sourceId
def getContent(self,sourceId):
url = "".join(["http://www.duanwenxue.com/article/",str(sourceId),".html"])
#print url
html = self.getHtml(url)
#這是正則識別內容和鏈接
reg='<div id=.*?class=.*?>\s*<div id="s-article-main01" class=.*?></div>\s*<p>(.*)</p>\s*<div class=.*?>\s*<h3>.*</h3>\s*<p>.*<a href="(.*?)" target="_blank">.*</a></p>\s*<p>.*<a href="(.*?)" target="_blank">.*</a></p>\s*</div>\s*<div id="s-article-main02" class="content-in-bottom"></div>\s*</div>\s*<div class=.*?>\s*<span>.*<a href="(.*?)">.*</a> </span> <span>(.*|.*<a href=(.*?)>.*</a> )</span>'
self.wenxueContent=re.compile(reg).findall(html)
for res in self.wenxueContent:
content = self.processContent(res[0])
print content
for v in range(1,len(res)):
thisSourceId=self.getSourceId(res[v])
#print thisSourceId,"/"
for _id in thisSourceId:
if _id not in self.sett:
#print _id
self.sett.add(_id)
self.myqueue.put(_id)
self.count = self.count+1
else:
pass
self.ok=True
def run(self):
while True:
print self.count
if self.myqueue.qsize() > 0:
#print self.sett
sourceid = self.myqueue.get()
self.getContent(sourceid)
#起始連接
sourceId = "307683"
#所有爬到的,未讀取的連接放到這裏面
q=Queue.Queue(maxsize = 0)
#set用來判斷之前有沒有采集過,這個學過其它語言的都應該知道set幹嘛的
sett = set(["307683"])
#計數
count = 1
q.put(sourceId)
#wenxueModel = Wenxue_Spider_Model(q,sourceId)
#這裏本來想開啓多個線程的,但是取到的數目不是很穩定,不知道爲啥,
#還這個爬蟲只能爬到515條數據,還不如一頁一頁的收集按頁收集來得全,所以這只是個原理介紹
Wenxue_Spider_Model(q,sourceId,sett,count).start() <strong>
</strong>
這是爬蟲的效果: