BeautifulSoup抓取百度贴吧

BeautifulSoup是python一种原生的解析文件的模块,区别于scrapy,scrapy是一种封装好的框架,只需要按结构进行填空,而BeautifulSoup就需要自己造轮子,相对scrapy麻烦一点但也更加灵活一些

以爬取百度贴吧内容示例说明。

# -*- coding:utf-8 -*-
__author__=‘fengzhankui‘
import urllib2
from bs4 import  BeautifulSoup
class Item(object):
    title=None
    firstAuthor=None
    firstTime=None
    reNum=None
    content=None
    lastAuthor=None
    lastTime=None
class GetTiebaInfo(object):
    def __init__(self,url):
        self.url=url
        self.pageSum=5
        self.urls=self.getUrls(self.pageSum)
        self.items=self.spider(self.urls)
        self.pipelines(self.items)
    def getUrls(self,pageSum):
        urls=[]
        pns=[str(i*50) for i in range(pageSum)]
        ul=self.url.split(‘=‘)
        for pn in pns:
            ul[-1]=pn
            url=‘=‘.join(ul)
            urls.append(url)
        return urls
    def spider(self,urls):
        items=[]
        for url in urls:
            htmlContent=self.getResponseContent(url)
            soup=BeautifulSoup(htmlContent,‘lxml‘)
            tagsli = soup.find_all(‘li‘,class_=[‘j_thread_list‘,‘clearfix‘])[2:]
            for tag in tagsli:
                if tag.find(‘div‘,attrs={‘class‘: ‘threadlist_abs threadlist_abs_onlyline ‘})==None:
                    continue
                item=Item()
                item.title=tag.find(‘a‘,attrs={‘class‘:‘j_th_tit‘}).get_text().strip()
                item.firstAuthor=tag.find(‘span‘,attrs={‘class‘:‘frs-author-name-wrap‘}).a.get_text().strip()
                item.firstTime = tag.find(‘span‘, attrs={‘title‘: u‘创建时间‘.encode(‘utf8‘)}).get_text().strip()
                item.reNum = tag.find(‘span‘, attrs={‘title‘: u‘回复‘.encode(‘utf8‘)}).get_text().strip()
                item.content = tag.find(‘div‘,attrs={‘class‘: ‘threadlist_abs threadlist_abs_onlyline ‘}).get_text().strip()
                item.lastAuthor = tag.find(‘span‘,attrs={‘class‘: ‘tb_icon_author_rely j_replyer‘}).a.get_text().strip()
                item.lastTime = tag.find(‘span‘, attrs={‘title‘: u‘最后回复时间‘.encode(‘utf8‘)}).get_text().strip()
                items.append(item)
        return items
    def pipelines(self,items):
        with open(‘tieba.txt‘,‘a‘) as fp:
            for item in items:
                fp.write(‘title:‘+item.title.encode(‘utf8‘)+‘\t‘)
                fp.write(‘firstAuthor:‘+item.firstAuthor.encode(‘utf8‘) + ‘\t‘)
                fp.write(‘reNum:‘+item.reNum.encode(‘utf8‘) + ‘\t‘)
                fp.write(‘content:‘ + item.content.encode(‘utf8‘) + ‘\t‘)
                fp.write(‘lastAuthor:‘ + item.lastAuthor.encode(‘utf8‘) + ‘\t‘)
                fp.write(‘lastTime:‘ + item.lastTime.encode(‘utf8‘) + ‘\t‘)
                fp.write(‘\n‘)
    def getResponseContent(self,url):
        try:
            response=urllib2.urlopen(url.encode(‘utf8‘))
        except:
            print ‘fail‘
        else:
            return response.read()
if __name__==‘__main__‘:
    url=u‘http://tieba.baidu.com/f?kw=战狼2&ie=utf-8&pn=50‘
    GetTiebaInfo(url)

代码说明:

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

时间: 2024-07-30 23:16:52

BeautifulSoup抓取百度贴吧的相关文章

python3用BeautifulSoup抓取id='xiaodeng',且正则包含‘elsie’的标签

# -*- coding:utf-8 -*- #python 2.7 #XiaoDeng #http://tieba.baidu.com/p/2460150866 #使用多个指定名字的参数可以同时过滤tag的多个属性 from bs4 import BeautifulSoup import urllib.request import re #如果是网址,可以用这个办法来读取网页 #html_doc = "http://tieba.baidu.com/p/2460150866" #req

Python3抓取百度贴吧图片

我抓取的地址是http://tieba.baidu.com/p/3125473879?pn=2,这个帖子共有82页左右,下面的代码主要抓取82页的所有图片,具体代码如下: """抓取百度贴吧图片""" #导入模块 import re import urllib from urllib.request import urlopen,urlretrieve #获取抓取页面的源代码 def getHtml(url):     page = urlope

php抓取百度快照、百度收录、百度热词程序代码

<?/*抓取百度收录代码*/function baidu($s){ $baidu="http://www.baidu.com/s?wd=site%3A".$s; $site=file_get_contents($baidu); //$site=iconv("gb2312", "UTF-8", $site); ereg("找到相关网页(.*)篇,", $site,$count); $count=str_replace(&q

爬虫抓取百度贴吧帖子内容

上篇文章已经介绍了抓取糗事百科的段子,这篇文章来抓取百度贴吧帖子内容,涉及到urllib,urllib2,re等模块. 代码实现功能: 1.获取某一个帖子的标题 2.获取帖子回复的所有页数,以及每一页的内容 3.可以只获取楼主的回复(使用数字1声明),或者所有回复(使用数字0声明) 直接使用oop编程的方式编写代码: 代码如下: #!/usr/bin/env python #coding:utf8 import urllib import urllib2 import re #处理页面标签类 c

用PHP抓取百度贴吧邮箱数据

注:本程序可能非常适合那些做百度贴吧营销的朋友. 去逛百度贴吧的时候,经常会看到楼主分享一些资源,要求留下邮箱,楼主才给发. 对于一个热门的帖子,留下的邮箱数量是非常多的,楼主需要一个一个的去复制那些回复的邮箱,然后再粘贴发送邮件,不是被折磨死就是被累死.无聊至极写了一个抓取百度贴吧邮箱数据的程序,需要的拿走. 程序实现了一键抓取帖子全部邮箱和分页抓取邮箱两个功能,界面懒得做了,效果如下: 老规矩,直接贴源码 <?php $url2=""; $page="";

BeautifulSoup抓取门户网站上的链接

使用BeautifulSoup抓取门户网站上的所有跳转链接 from bs4 import BeautifulSoup import urllib2 request = urllib2.Request('http://www.163.com') response = urllib2.urlopen(request) html_doc = response.read() soup = BeautifulSoup(html_doc , from_encoding = "gb18030")

C#.Net使用正则表达式抓取百度百家文章列表

工作之余,学习了一下正则表达式,鉴于实践是检验真理的唯一标准,于是便写了一个利用正则表达式抓取百度百家文章的例子,具体过程请看下面源码: 一:获取百度百家网页内容 1 public List<string[]> GetUrl() 2 { 3 try 4 { 5 string url = "http://baijia.baidu.com/"; 6 WebRequest webRequest = WebRequest.Create(url); 7 WebResponse web

Python:使用 BeautifulSoup 库抓取百度天气

最近研究了Python的BeautifulSoup库,用起来还挺好玩的一.安装:使用pip命令在线安装:在cmd窗口中输入:pip install beautilfulsoup4 二.代码思路:1.使用request获取相关网页的返回值,即HTML对象: 方法一2.通过BeautifulSoup库对HTML页面元素进行解析,需要先分析要抓取的内容在哪里,再通过代码获取,存储在列表中:方法二3.读取列表中内容,写入到csv文件中.方法三 ```pythonfrom bs4 import Beaut

python抓取百度彩票的双色球数据

最近在学习<机器学习实战>这本书,在学习的过程中不免要自己去实践,写些练习.这写练习的第一步就需要收集数据,所以为了写好自己的练习程序,我得先学会收集一些网络数据.了解到用python抓取网页数据的一些方法后,我就根据别人的demo,自己实践了一下,学着从百度彩票网站上抓取双色球的历史数据.以下我就介绍一下自己的小程序. 大致思路如下 找到相关url和其参数 找出页面上你要抓取的数据的位置,也就是说这个数据在那些标签下 将每页中学要的数据取下来按一定格式存放在自己本地 需要的环境: pytho