日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python spider code

發(fā)布時(shí)間:2025/4/14 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python spider code 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


Python代碼??
  • #FileName:?toolbox_insight.py??
  • from?sgmllib?import?SGMLParser??
  • import?threading??
  • import?time??
  • import?urllib2??
  • import?StringIO??
  • import?gzip??
  • import?string??
  • import?os??
  • #rewrite?SGMLParser?for?start_a??
  • class?Basegeturls(SGMLParser):???#這個(gè)Basegeturls類作用是分析下載的網(wǎng)頁,把網(wǎng)頁中的所有鏈接放在self.url中。??
  • ????def?reset(self):??
  • ????????self.url?=?[]??
  • ????????SGMLParser.reset(self)??
  • ????def?start_a(self,?attrs):??
  • ????????href?=?[v?for?k,?v?in?attrs?if?k?==?'href']??
  • ????????if?href:??
  • ????????????self.url.extend(href)??
  • #for?quickly?finding??
  • class?Newlist(list):#這個(gè)類其實(shí)是一個(gè)添加了find方法的LIST。當(dāng)num變量在LIST中,返回True,當(dāng)不在LIST中,返回False并把num按二分法插入LIST中??
  • ????def?find(self,?num):??
  • ????????l?=?len(self)??
  • ????????first?=?0??
  • ????????end?=?l?-?1??
  • ????????mid?=?0??
  • ????????if?l?==?0:??
  • ????????????self.insert(0,num)??
  • ????????????return?False??
  • ????????while?first?<?end:??
  • ????????????mid?=?(first?+?end)/2??
  • ????????????if?num?>?self[mid]:??
  • ????????????????first?=?mid?+?1??
  • ????????????elif?num?<?self[mid]:??
  • ????????????????end?=?mid?-?1??
  • ????????????else:??
  • ????????????????break??
  • ????????if?first?==?end:??
  • ????????????if?self[first]?>?num:??
  • ????????????????self.insert(first,?num)??
  • ????????????????return?False??
  • ????????????elif?self[first]?<?num:??
  • ????????????????self.insert(first?+?1,?num)??
  • ????????????????return?False??
  • ????????????else:??
  • ????????????????return?True??
  • ????????elif?first?>?end:??
  • ????????????self.insert(first,?num)??
  • ????????????return?False??
  • ????????else:??
  • ????????????return?True??
  • #下面的reptile顧名思義是一個(gè)爬蟲??????????
  • class?reptile(threading.Thread):??
  • ????#Name:???????是爬蟲是名字,queue是任務(wù)隊(duì)列,所有的爬蟲共用同一個(gè)任務(wù)隊(duì)列??
  • ????#從中取出一個(gè)任務(wù)項(xiàng)進(jìn)行運(yùn)行,每個(gè)任務(wù)項(xiàng)是一個(gè)要下載網(wǎng)頁的URL??
  • ????#result:?????也是一個(gè)隊(duì)列,將下載的網(wǎng)頁中包含的URL放入該隊(duì)列中??
  • ????#inittime:???在本程序中沒有用,只是一個(gè)為了以后擴(kuò)展用的??
  • ????#downloadway:是下載的網(wǎng)頁存放的路徑??
  • ????#configfile:?是配置文件,存放網(wǎng)頁的URL和下載下后的路徑??
  • ????#maxnum:?????每個(gè)爬蟲有個(gè)最大下載量,當(dāng)下載了這么多網(wǎng)頁后,爬蟲dead??
  • ????def?__init__(self,?Name,?queue,?result,?Flcok,?inittime?=?0.00001,?downloadway?=?'D:\\bbs\\',configfile?=?'D:\\bbs\\conf.txt',?maxnum?=?10000):??
  • ????????threading.Thread.__init__(self,?name?=?Name)??
  • ????????self.queue?=?queue??
  • ????????self.result?=?result??
  • ????????self.Flcok?=?Flcok??
  • ????????self.inittime?=?inittime??
  • ????????self.mainway?=?downloadway??
  • ????????self.configfile?=?configfile??
  • ????????self.num?=?0??????????#已下載的網(wǎng)頁個(gè)數(shù)??
  • ????????self.maxnum?=?maxnum??
  • ????????os.makedirs(downloadway?+?self.getName())??????#系統(tǒng)調(diào)用:在存放網(wǎng)頁的文件夾中創(chuàng)建一個(gè)以該爬蟲name為名字的文件夾??
  • ????????self.way?=?downloadway?+?self.getName()?+?'\\'??
  • ????def?run(self):??
  • ????????opener?=?urllib2.build_opener()?????#創(chuàng)建一個(gè)開啟器??
  • ????????while?True:??
  • ????????????url?=?self.queue.get()??????????#從隊(duì)列中取一個(gè)URL??
  • ????????????if?url?==?None:?????????????????#當(dāng)取得一個(gè)None后表示爬蟲結(jié)束工作,用于外部方便控制爬蟲的生命期??
  • ????????????????break??
  • ????????????parser?=?Basegeturls()??????????#創(chuàng)建一個(gè)網(wǎng)頁分析器??
  • ????????????request?=?urllib2.Request(url)?#網(wǎng)頁請求??
  • ????????????request.add_header('Accept-encoding',?'gzip')#下載的方式是gzip壓縮后的網(wǎng)頁,gzip是大多數(shù)服務(wù)器支持的一種格式??
  • ????????????try:?????????????????????????????????????????#這樣可以減輕網(wǎng)絡(luò)壓力??
  • ????????????????page?=?opener.open(request)#發(fā)送請求報(bào)文??
  • ????????????????if?page.code?==?200:???????#當(dāng)請求成功??
  • ????????????????????predata?=?page.read()?#下載gzip格式的網(wǎng)頁??
  • ????????????????????pdata?=?StringIO.StringIO(predata)#下面6行是實(shí)現(xiàn)解壓縮??
  • ????????????????????gzipper?=?gzip.GzipFile(fileobj?=?pdata)??
  • ????????????????????try:??
  • ????????????????????????data?=?gzipper.read()??
  • ????????????????????except(IOError):??
  • ????????????????????????print?'unused?gzip'??
  • ????????????????????????data?=?predata#當(dāng)有的服務(wù)器不支持gzip格式,那么下載的就是網(wǎng)頁本身??
  • ????????????????????try:??
  • ????????????????????????parser.feed(data)#分析網(wǎng)頁??
  • ????????????????????except:??
  • ????????????????????????print?'I?am?here'#有的網(wǎng)頁分析不了,如整個(gè)網(wǎng)頁就是一個(gè)圖片??
  • ????????????????????for?item?in?parser.url:??
  • ????????????????????????self.result.put(item)#分析后的URL放入隊(duì)列中??
  • ????????????????????way?=?self.way?+?str(self.num)?+?'.html'#下面的是網(wǎng)頁的保存,不多說了??
  • ????????????????????self.num?+=?1??
  • ????????????????????file?=?open(way,?'w')??
  • ????????????????????file.write(data)??
  • ????????????????????file.close()??
  • ????????????????????self.Flcok.acquire()??
  • ????????????????????confile?=?open(self.configfile,?'a')??
  • ????????????????????confile.write(?way?+?'?'?+?url?+?'\n')??
  • ????????????????????confile.close()??
  • ????????????????????self.Flcok.release()??
  • ????????????????page.close()??
  • ????????????????if?self.num?>=?self.maxnum:#達(dá)到最大量后退出??
  • ????????????????????break??
  • ????????????except:??
  • ????????????????print?'end?error'??
  • #和爬蟲一樣是個(gè)線程類,作用是將爬蟲中的result中存入的URL加以處理。只要同一個(gè)服務(wù)器的網(wǎng)頁??
  • class?proinsight(threading.Thread):??
  • ????def?__init__(self,?queue,?list,?homepage,?inqueue):??
  • ????????threading.Thread.__init__(self)??
  • ????????self.queue?=?queue#和爬蟲中的result隊(duì)列是同一個(gè)??
  • ????????self.list?=?list#是上面Newlist的對象??
  • ????????self.homepage?=?homepage#主頁??
  • ????????self.inqueue?=?inqueue#處理完后的URL的去處??
  • ????def?run(self):??
  • ????????length?=?len(self.homepage)??
  • ????????while?True:??
  • ????????????item?=?self.queue.get()??
  • ????????????if?item?==?None:??
  • ????????????????break??
  • ????????????if?item[0:4]?==?'\r\n':??
  • ????????????????item?=?item[4:]??
  • ????????????if?item[-1]?==?'/':??
  • ????????????????item?=?item[:-1]??
  • ????????????if?len(item)?>=?len('http://')?and?item[0:7]?==?'http://':??
  • ????????????????if?len(item)?>=?length?and?item[0:length]?==?self.homepage:??
  • ????????????????????if?self.list.find(item)?==?False:??
  • ????????????????????????self.inqueue.put(item)??
  • ????????????elif?item[0:5]?==?'/java'?or?item[0:4]?==?'java':??
  • ????????????????pass??
  • ????????????else:?????
  • ????????????????if?item[0]?!=?'/':??
  • ????????????????????item?=?'/'?+?item??
  • ????????????????item?=?self.homepage?+?item??
  • ????????????????if?self.list.find(item)?==?False:??
  • ????????????????????self.inqueue.put(item)??
  • 下面的是一個(gè)主函數(shù)過程??
  • 我下載的網(wǎng)站是http://bbs.hit.edu.cn??
  • 開始網(wǎng)頁是http://bbs.hit.edu.cn/mainpage.php??
  • #FileName:test??
  • from?toolbox_insight?import?*??
  • from?Queue?import?Queue??
  • import?threading??
  • import?sys??
  • num?=?int(raw_input('Enter?the?number?of?thread:'))??
  • pnum?=?int(raw_input('Enter?the?number?of?download?pages:'))??
  • mainpage?=?str(raw_input('The?mainpage:'))??
  • startpage?=?str(raw_input('Start?page:'))??
  • queue?=?Queue()??
  • key?=?Queue()??
  • inqueue?=?Queue()??
  • list?=?Newlist()??
  • thlist?=?[]??
  • Flock?=?threading.RLock()??
  • for?i?in?range(num):??
  • ????th?=?reptile('th'?+?str(i),?queue,?key,?Flock)??
  • ????thlist.append(th)??
  • pro?=?proinsight(key,?list,?mainpage,?inqueue)??
  • pro.start()??
  • for?i?in?thlist:??
  • ????i.start()??
  • queue.put(startpage)??
  • for?i?in?range(pnum):??
  • ????queue.put(inqueue.get())??
  • for?i?in?range(num):??
  • ????queue.put(None) ?

  • 總結(jié)

    以上是生活随笔為你收集整理的python spider code的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。