python 爬蟲試手,好簡單的爬蟲

目標是爬一下這個網站上點一些句子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>


這是爬蟲的效果:




發佈了37 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章