BeautifulSoup是python一種原生的解析檔案的子產品,差別于scrapy,scrapy是一種封裝好的架構,隻需要按結構進行填空,而BeautifulSoup就需要自己造輪子,相對scrapy麻煩一點但也更加靈活一些
以爬取百度貼吧内容示例說明。
<code># -*- coding:utf-8 -*-</code>
<code>__author__</code><code>=</code><code>'fengzhankui'</code>
<code>import</code> <code>urllib2</code>
<code>from</code> <code>bs4 </code><code>import</code> <code>BeautifulSoup</code>
<code>class</code> <code>Item(</code><code>object</code><code>):</code>
<code> </code><code>title</code><code>=</code><code>None</code>
<code> </code><code>firstAuthor</code><code>=</code><code>None</code>
<code> </code><code>firstTime</code><code>=</code><code>None</code>
<code> </code><code>reNum</code><code>=</code><code>None</code>
<code> </code><code>content</code><code>=</code><code>None</code>
<code> </code><code>lastAuthor</code><code>=</code><code>None</code>
<code> </code><code>lastTime</code><code>=</code><code>None</code>
<code>class</code> <code>GetTiebaInfo(</code><code>object</code><code>):</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>,url):</code>
<code> </code><code>self</code><code>.url</code><code>=</code><code>url</code>
<code> </code><code>self</code><code>.pageSum</code><code>=</code><code>5</code>
<code> </code><code>self</code><code>.urls</code><code>=</code><code>self</code><code>.getUrls(</code><code>self</code><code>.pageSum)</code>
<code> </code><code>self</code><code>.items</code><code>=</code><code>self</code><code>.spider(</code><code>self</code><code>.urls)</code>
<code> </code><code>self</code><code>.pipelines(</code><code>self</code><code>.items)</code>
<code> </code><code>def</code> <code>getUrls(</code><code>self</code><code>,pageSum):</code>
<code> </code><code>urls</code><code>=</code><code>[]</code>
<code> </code><code>pns</code><code>=</code><code>[</code><code>str</code><code>(i</code><code>*</code><code>50</code><code>) </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(pageSum)]</code>
<code> </code><code>ul</code><code>=</code><code>self</code><code>.url.split(</code><code>'='</code><code>)</code>
<code> </code><code>for</code> <code>pn </code><code>in</code> <code>pns:</code>
<code> </code><code>ul[</code><code>-</code><code>1</code><code>]</code><code>=</code><code>pn</code>
<code> </code><code>url</code><code>=</code><code>'='</code><code>.join(ul)</code>
<code> </code><code>urls.append(url)</code>
<code> </code><code>return</code> <code>urls</code>
<code> </code><code>def</code> <code>spider(</code><code>self</code><code>,urls):</code>
<code> </code><code>items</code><code>=</code><code>[]</code>
<code> </code><code>for</code> <code>url </code><code>in</code> <code>urls:</code>
<code> </code><code>htmlContent</code><code>=</code><code>self</code><code>.getResponseContent(url)</code>
<code> </code><code>soup</code><code>=</code><code>BeautifulSoup(htmlContent,</code><code>'lxml'</code><code>)</code>
<code> </code><code>tagsli </code><code>=</code> <code>soup.find_all(</code><code>'li'</code><code>,</code><code>class_</code><code>=</code><code>[</code><code>'j_thread_list'</code><code>,</code><code>'clearfix'</code><code>])[</code><code>2</code><code>:]</code>
<code> </code><code>for</code> <code>tag </code><code>in</code> <code>tagsli:</code>
<code> </code><code>if</code> <code>tag.find(</code><code>'div'</code><code>,attrs</code><code>=</code><code>{</code><code>'class'</code><code>: </code><code>'threadlist_abs threadlist_abs_onlyline '</code><code>})</code><code>=</code><code>=</code><code>None</code><code>:</code>
<code> </code><code>continue</code>
<code> </code><code>item</code><code>=</code><code>Item()</code>
<code> </code><code>item.title</code><code>=</code><code>tag.find(</code><code>'a'</code><code>,attrs</code><code>=</code><code>{</code><code>'class'</code><code>:</code><code>'j_th_tit'</code><code>}).get_text().strip()</code>
<code> </code><code>item.firstAuthor</code><code>=</code><code>tag.find(</code><code>'span'</code><code>,attrs</code><code>=</code><code>{</code><code>'class'</code><code>:</code><code>'frs-author-name-wrap'</code><code>}).a.get_text().strip()</code>
<code> </code><code>item.firstTime </code><code>=</code> <code>tag.find(</code><code>'span'</code><code>, attrs</code><code>=</code><code>{</code><code>'title'</code><code>: u</code><code>'建立時間'</code><code>.encode(</code><code>'utf8'</code><code>)}).get_text().strip()</code>
<code> </code><code>item.reNum </code><code>=</code> <code>tag.find(</code><code>'span'</code><code>, attrs</code><code>=</code><code>{</code><code>'title'</code><code>: u</code><code>'回複'</code><code>.encode(</code><code>'utf8'</code><code>)}).get_text().strip()</code>
<code> </code><code>item.content </code><code>=</code> <code>tag.find(</code><code>'div'</code><code>,attrs</code><code>=</code><code>{</code><code>'class'</code><code>: </code><code>'threadlist_abs threadlist_abs_onlyline '</code><code>}).get_text().strip()</code>
<code> </code><code>item.lastAuthor </code><code>=</code> <code>tag.find(</code><code>'span'</code><code>,attrs</code><code>=</code><code>{</code><code>'class'</code><code>: </code><code>'tb_icon_author_rely j_replyer'</code><code>}).a.get_text().strip()</code>
<code> </code><code>item.lastTime </code><code>=</code> <code>tag.find(</code><code>'span'</code><code>, attrs</code><code>=</code><code>{</code><code>'title'</code><code>: u</code><code>'最後回複時間'</code><code>.encode(</code><code>'utf8'</code><code>)}).get_text().strip()</code>
<code> </code><code>items.append(item)</code>
<code> </code><code>return</code> <code>items</code>
<code> </code><code>def</code> <code>pipelines(</code><code>self</code><code>,items):</code>
<code> </code><code>with </code><code>open</code><code>(</code><code>'tieba.txt'</code><code>,</code><code>'a'</code><code>) as fp:</code>
<code> </code><code>for</code> <code>item </code><code>in</code> <code>items:</code>
<code> </code><code>fp.write(</code><code>'title:'</code><code>+</code><code>item.title.encode(</code><code>'utf8'</code><code>)</code><code>+</code><code>'\t'</code><code>)</code>
<code> </code><code>fp.write(</code><code>'firstAuthor:'</code><code>+</code><code>item.firstAuthor.encode(</code><code>'utf8'</code><code>) </code><code>+</code> <code>'\t'</code><code>)</code>
<code> </code><code>fp.write(</code><code>'reNum:'</code><code>+</code><code>item.reNum.encode(</code><code>'utf8'</code><code>) </code><code>+</code> <code>'\t'</code><code>)</code>
<code> </code><code>fp.write(</code><code>'content:'</code> <code>+</code> <code>item.content.encode(</code><code>'utf8'</code><code>) </code><code>+</code> <code>'\t'</code><code>)</code>
<code> </code><code>fp.write(</code><code>'lastAuthor:'</code> <code>+</code> <code>item.lastAuthor.encode(</code><code>'utf8'</code><code>) </code><code>+</code> <code>'\t'</code><code>)</code>
<code> </code><code>fp.write(</code><code>'lastTime:'</code> <code>+</code> <code>item.lastTime.encode(</code><code>'utf8'</code><code>) </code><code>+</code> <code>'\t'</code><code>)</code>
<code> </code><code>fp.write(</code><code>'\n'</code><code>)</code>
<code> </code><code>def</code> <code>getResponseContent(</code><code>self</code><code>,url):</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>response</code><code>=</code><code>urllib2.urlopen(url.encode(</code><code>'utf8'</code><code>))</code>
<code> </code><code>except</code><code>:</code>
<code> </code><code>print</code> <code>'fail'</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>return</code> <code>response.read()</code>
<code>if</code> <code>__name__</code><code>=</code><code>=</code><code>'__main__'</code><code>:</code>
<code> </code><code>url</code><code>=</code><code>u</code><code>'http://tieba.baidu.com/f?kw=戰狼2&ie=utf-8&pn=50'</code>
<code> </code><code>GetTiebaInfo(url)</code>
代碼說明:
這個例子是按照scrapy那樣的結構,定義一個item類,然後抽取url中的html,再然後交給第三個方法進行處理,由于貼吧都有置頂的條目,因為比對class類名預設都是按in處理的,不能and處理,是以不能精确比對類名,在tag循環過濾的時候才會有過濾置頂内容的條件篩選
本文轉自 無心低語 51CTO部落格,原文連結:http://blog.51cto.com/fengzhankui/1946288,如需轉載請自行聯系原作者