Python(五)——简单爬虫学习
掌握爬蟲是很有用的技能,也是python中非常受歡迎的一種應用。
“學會爬蟲,我們就掌握了整個世界”,雖然沒有這么夸張,但確實可以通過爬蟲去爬取很多你所需要的數據。
本章節僅介紹輕量級爬蟲的開發(其實都是自己在學習過程中的筆記)
爬蟲:一段自動抓取互聯網信息的程序
?
URL管理器:管理待抓取URL集合和已抓取URL集合
? ? ? ——防止重復抓取、防止循環抓取
網頁下載器(爬蟲的核心):將互聯網上URL對應的網頁下載到本地的工具
Python網頁下載器有以下兩種
? ? ? urllib2:Python官方基礎模塊
? ? ? requests:第三方包(更強大)
urllib2下載網頁方法1(最簡潔方法)
import urllib2 #直接請求 response = urllib2.urlopen('http://www.baidu.com') #獲取狀態碼,如果是200表示獲取成功 print response.getcode() #讀取內容 cont = response.read()urllib2下載網頁方法2:添加data、http header
import urllib2 #創建Request對象 request = urllib2.Request(url)#添加數據 request.add_data('a', '1') #添加http的header request.add_header('User-Agent', 'Mozilla/5.0')#發送請求獲取結果 response = urllib2.urlopen(request)urllib2下載網頁方法3:添加特殊情景的處理器
HTTPCookieProcessor ? ?? ProxyHandler ? ? HTTPSHandler ? ?? HTTPRedirectHandler
import urllib2, cookielib#創建cookie容器 cj = cookielib.CookieJar()#創建1個opener opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))#給urllib2安裝opener urllib2.install_opener(opener)#使用帶有cookie的urllib2訪問網頁 response = urllib2.urlopen("http://www.baidu.com/")Python網頁解析器:從網頁中提取有價值數據的工具
以下是四種Python網頁解析器
正則表達式 ? ?? html.parser ? ?? Beautiful Soup ? ?? lxml
結構化解析-DOM(Document Object Model)數,以樹的方式進行上下級元素的遍歷和訪問
?
Beautiful Soup:Python第三方庫,用于從HTML或XML中提取數據
官網: http://www.crummy.com/software/BeautifulSoup/
from bs4 import BeautifulSoup#根據HTML網頁字符串創建BeautifulSoup對象 soup = BeautifulSoup(html_doc, #HTML文檔字符串'html.parser', #HTML解析器from_encoding = utf8 #HTML文檔的編碼)下面我們來實際進行一個項目
if __name__"__main__":root_url = "http://baike.daidu.com/view/21084.htm" #入口urlobj_spider = SpiderMain() #爬蟲入口obj_spider.craw(root_url) #啟動爬蟲class SpiderMain(object):def __init__(self):self.urls = urls_manager.UrlManager()self.downloader = html_parser.HtmlParser()self.parser = html_parser.HtmlParser()self.outputer = html_outputer.HtmlOutputer()def craw(self, root_url):count = 1 #用來記錄當前爬取的是第幾個urlself.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: #只爬取1000個頁面breakcount++except:print 'craw failed'self.outputer.output_html()class UrlManager(object): #管理器def __init__(self):self.new_urls = set()self.old_urls = set()def add_new_url(self, url):if url is None:returnif url not in self.new_urls and url not in self_old_urls:self.new_urls.add(url)def add_new_urls(self, urls):if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)def has_new_url(self):return len(self.new_urls) != 0def get_new_url(self):new_url = self.new_urls.pop()self.old_urls.add(new_url)return new_urlclass HtmlDownloader(object): #下載器def download(self, url):if url is None:return Noneresponse = urllib2.urlopen(url)if response.getcode() != 200:return Nonereturn response.read()import Beautiful import urlparserclass HtmlParser(object): #解析器def _get_new_urls(self, page_url, soup):new_urls = set()links = soup.find_add('a', href = re.compile(r"view/\d+\.htm"))for link in links:new_url = link['href']new_full_url = urlparser.urljoin(page_url, new_url)new_urls.add(new_full_url)return new_urlsdef _get_new_data(self, page_url, soup):res_data = {}#urlres_data['url'] = page_url#<dd class="lemmaWgt-lemmaTitle-title"> <h1>Python</h1>title_node = soup.find('dd', class = "lemmaWgt-lemmaTitle-title").find("hi")res_data['title'] = title_node.get_text()#<div class="lemma-summary">summary_node = soup.find('div', class_="lemma-summary")res_data['summary'] = summary_node.get_text()return res_urldef parse(self, page_url, html_cont):if page_url is None or html_cont in None:returnsoup = 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_dataclass HtmlOutputer(object):def __init__(self):self.datas = []def collect_data(self):if data in None:returnself.datas.append(data)def output_html(self):fout open('output.html', 'w') #新建一個輸出的文件fout.write("<html>") #以html格式輸出文檔fout.write("<body>")fout.write("<table>") #建立表格#python默認編碼 ascll 換編碼方式可以輸出 .encode('utf-8')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("<html>")fout.write("<body>")fout.write("<table>")fout.close()可能需要稍加改動,不過應該import一些包就可以運行了。
可以試著嘗試一下,并且再寫的過程中可以感受到這種編程方式和代碼風格比較直觀,也很好理解
?
其實爬蟲的內容還有很多,這只是一個很簡單的入門級例子,學習到后面可以爬取很多你想要的內容,當然也會遇到很多問題,解決了這樣那樣的問題,你就會發現爬蟲的樂趣。
加油,共勉!!
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Python(五)——简单爬虫学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 网络爬虫入门详解
- 下一篇: Mysql创建管理表的内容上的打字练习