求幫助~~~捉急啊
我用的phtyon 3.5,自己改了一些地方,但結(jié)果出來是空白頁,而且不循環(huán),只抓到一個空白頁運(yùn)行結(jié)果如圖:
spider_main:
import url_manager,html_downloader,html_parser,html_outputer
class SpiderMain(object):
? ?def __init__(self):
? ? ? ?self.urls=url_manager.UrlManager()
? ? ? ?self.downloader=html_downloader.HtmlDownloader()
? ? ? ?self.parser=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()
? ? ? ? ? ? ? ?print ('craw %d:%s'%(count,new_url))
? ? ? ? ? ? ? ?html_cont=self.downloader.download(new_url)
? ? ? ? ? ? ? ?new_urls,new_data=self.parser.parse(new_url,html_cont)
? ? ? ? ? ? ? ?self.urls.add_new_urls(new_urls)
? ? ? ? ? ? ? ?self.outputer.collect_data(new_data)
? ? ? ? ? ? ? ?if count==1000:
? ? ? ? ? ? ? ? ? ?break
? ? ? ? ? ? ? ?count=count+1
? ? ? ? ? ?except:
? ? ? ? ? ? ? ?print ('craw failed')
? ? ? ? ? ?self.outputer.output_html()
if __name__=="__main__":
? ?root_url="http://baike.baidu.com/view/21087.htm"
? ?obj_spider=SpiderMain()
? ?obj_spider.craw(root_url)
url_manager:
class UrlManager(object):
? ? def __init__(self):#需要維護(hù)兩個列表-帶爬取得url列表,爬取過的url列表
? ? ? ? self.new_urls=set()
? ? ? ? self.old_urls=set()
? ??
? ? def add_new_url(self,url):#向url管理器中添加一個新的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)
? ??
? ? def add_new_urls(self,urls):#向url管理器中添加批量url
? ? ? ? if url is None or len(urls)==0:
? ? ? ? ? ? return
? ? ? ? for url in urls:#通過循環(huán)一個一個添加
? ? ? ? ? ? self.add_new_url(url)
? ? ? ? ? ??
? ? def has_new_url(self):#判斷管理器中是否有新的待爬取的url
? ? ? ? return len(self.new_urls)!=0
? ??
? ? def get_new_url(self):#從url管理器中獲取一個新的帶爬取得url
? ? ? ? new_url=self.new_urls.pop()#pop方法會從列表中獲取url并會移除
? ? ? ? self.old_urls.add(new_url)#將此url添加進(jìn)old_url
? ? ? ? return new_url
? ??
html_downloader:
import urllib
class HtmlDownloader(object):
? ? def download(self,url):
? ? ? ? if url is None:
? ? ? ? ? ? return None
? ? ? ? response=urllib.urlopen(url)#請求url內(nèi)容
? ? ? ? if response.getcode()!=200:
? ? ? ? ? ? return None
? ? ? ? return response.read()#返回下載好的內(nèi)容
html_outputer:
class HtmlOutputer(object):
? ??
? ? def __init__(self):#初始化構(gòu)造函數(shù),維護(hù)收集的數(shù)據(jù)存入數(shù)組
? ? ? ? self.datas=[]
? ??
? ? def collect_data(self,data):
? ? ? ? if data is None:
? ? ? ? ? ? return
? ? ? ? self.datas.append(data)
? ??
? ? def output_html(self):
? ? ? ? fout=open('output.html','w')#輸出html文件
? ? ? ? fout.write("<html>")
? ? ? ? fout.write("<body>")
? ? ? ? fout.write("<table>")
? ? ? ? #ascii
? ? ? ? for data in self.datas:
? ? ? ? ? ? fout.write("<tr>")
? ? ? ? ? ??
? ? ? ? ? ? fout.write("<td>%s</td>"%data['url'])
? ? ? ? ? ? fout.write("<td>%s</td>"%data['title'].encode('utf-8'))
? ? ? ? ? ? fout.write("<td>%s</td>"%data['summary'].encode('utf-8'))
? ? ? ? ? ??
? ? ? ? ? ? fout.write("</tr>")
? ? ? ? fout.write("</table>")
? ? ? ? fout.write("</body>")
? ? ? ? fout.write("</html>")
? ? ? ? fout.close()
html_parser:
from bs4 import BeautifulSoup
import re
import urllib.parse
class HtmlParser(object):
? ? def _get_new_urls(self,page_url,soup):
? ? ? ? new_urls=set()
? ? ? ? #/view/123.htm
? ? ? ? links=soup.find_all('a',href=re.compile(r"/view/\d+\.htm"))#獲取鏈接
? ? ? ? for link in links:
? ? ? ? ? ? new_url=link['href']#不完整的鏈接
? ? ? ? ? ? new_full_url=urllib.parse.urljoin(page_url,new_url)#自動將兩個不完整的鏈接拼成完整鏈接
? ? ? ? ? ? new_url.add(new_full_url)
? ? ? ? return new_urls
? ? def _get_new_data(self,page_url,soup):
? ? ? ? res_data={}
? ? ? ? #url
? ? ? ? res_data['url']=page_url
? ? ? ? #<dd class="lemmaWgt-lemmaTitle-title"> ?<h1>Python</h1>
? ? ? ? title_node=soup.find('dd').find("h1")
? ? ? ? res_data['title']=title_node.get_text()
? ? ? ? #<div class="lemma-summary" label-module="lemmaSummary">
? ? ? ? summary_node=soup.find('div')
? ? ? ? res_data['summary']=summary_node.get_text()#提取數(shù)據(jù)
? ? ? ? return res_data
? ? ? ??
? ? def parse(self,page_url,html_cont):
? ? ? ? if page_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(page_url,soup)
? ? ? ? new_data=self._get_new_data(page_url,soup)
? ? ? ? return new_urls,new_data
2017-11-13
python3.x ?使用 ?from urllib.parse import urljoin ? ? ??
?我的gitee代碼已經(jīng)跑通可以參考下:https://gitee.com/wilbur_li/pythonspider.git
2017-03-23
python3.0用urllib.parsar
2016-05-05
url_manager中的add_new_urls函數(shù)中的if里面的url丟s了
應(yīng)該為
def add_new_urls(self,urls):#向url管理器中添加批量url
? ? ? ? if urls is None or len(urls)==0:
? ? ? ? ? ? return
? ? ? ? for url in urls:#通過循環(huán)一個一個添加
? ? ? ? ? ? self.add_new_url(url)