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,如需转载请自行联系原作者