天天看点

python bs4抓取百度贴吧

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&amp;ie=utf-8&amp;pn=50'</code>

<code>    </code><code>GetTiebaInfo(url)</code>

代码说明:

这个例子是按照scrapy那样的结构,定义一个item类,然后抽取url中的html,再然后交给第三个方法进行处理,由于贴吧都有置顶的条目,因为匹配class类名默认都是按in处理的,不能and处理,所以不能精确匹配类名,在tag循环过滤的时候才会有过滤置顶内容的条件筛选

本文转自 无心低语 51CTO博客,原文链接:http://blog.51cto.com/fengzhankui/1946288,如需转载请自行联系原作者