美文网首页
使用python爬取糗百段子

使用python爬取糗百段子

作者: 龙腾九天ly | 来源:发表于2017-03-22 10:05 被阅读0次

博主CSDN昵称:守护者ly,欢迎大家前去指点
最近在自学Python爬虫,写了一个小demo,前来现学现卖!
感谢大神的博客!让我受益匪浅。python爬虫系列教程
开始之前啰嗦一句:不要因为我们的学习行为,影响到人家网站的正常运营
好了,开整!
首先博主用的是python3.6版本,据说python3的用户很少,我这也算个非主流了。。。不过博主正在切换python2,python2版本的demo会后续上传。
查看python版本,使用命令行直接敲入“python”命令即可

QQ截图20170322084416.png

首先,来一小段代码开开胃:

import requests


class py:
    def get_html(self, url):
      html = requests.get(url)
      print(html.text)

qiubai = py()
qiubai.get_html('http://www.qiushibaike.com/')

这里是使用了python的requests库进行http的get请求,requests库可以在命令行使用“pip install requests”安装。运行上述代码,会在控制台输出糗百首页的html源码,也是我们接下来工作的主要对象。

QQ截图20170322085254.png

在google浏览器上按下F12可以调用开发者工具,看到网页的源码,而我们所关注的信息是在id为“content-left”的<div>标签下,每一个class为“article block untagged mb15”的<div>标签都是一个段子的信息,包括作者,内容,图片,好笑数,评论数,点赞数,点踩数等等。而class为“pagination”的ul标签则包含了页面跳转的链接。

我们的解析信息工作,从一个正则表达式开始(糗百会不定期改版,这条正则到时候可能就不好使了,小伙伴需要发挥自己的聪明才智了哦):

        html = request.get(next_url, 3)
        pattern = re.compile('<div class="author clearfix">.*?href.*?<img src.*?title=.*?<h2>(.*?)</h2>.*?'
                             '<div class="content">.*?<span>(.*?)</span>.*?</div>.*?</a>(.*?)<div class="stats">'
                             '.*?class="stats-vote"><i class="number">(.*?)</i>.*?<i class="number">(.*?)</i>.*?'
                             'hidden">(.*?)</span>.*?hidden">-(.*?)</span>', re.S)
        # item[0] 用户昵称
        # item[1] 发布内容
        # item[2] 如果有内容,则为图片相关;否则是连续的\n符
        # item[3] 好笑
        # item[4] 评论数
        # item[5] 赞
        # item[6] 踩
        items = re.findall(pattern, html.text)
        # 匹配所有的<br/>字符
        replaceBR = re.compile(r'<br/>')
        # 匹配所有的\n串
        replaceN = re.compile(r'(\n)+')
        for item in items:
            # 将item[2]中的连续的\n字符串替换成一个None字符
            img = re.sub(replaceN, 'None', item[2])
            if img == 'None':
                print(item[0])
                # 将item[1]中的所有的<br/>字符替换成换行符
                print(re.sub(replaceBR, '\n', str(item[1])))
                print(u'好笑:', item[3], u' 评论:', item[4], u' 赞:', item[5], u'踩:', item[6])

所以匹配到的字符都会加入到一个我们定义的名为items的数组中,这个数组的长度最小为0(没有匹配),数组的每个元素又是一个长度为7的数组(因为我们在正则表达式中共有7个"(.*?)")。

乍一看这个正则表达式,有的人可能会有点懵逼,我们只看它的一小部分,“窥一斑而知全豹”,听贫道慢慢道来。

QQ截图20170322091340.png

每个段子包含的第一部分内容,就是作者的一些个人信息,<img>标签的链接是作者头像,h2标签中的内容是作者的昵称,再往下的<div>标签显示了作者的性别和年龄。我们的正则表达式匹配的就是以“author clearfix">”开头的,后续任意字符(也就是“.?”,匹配任意长度任意字符),然后匹配“href”字符等等,以此类推,直到“h2>(.?)</h2”这里我们注意一下,在上图中我们可以看到,它匹配的是“<h2>Boltzmann</h2>”这段,“(.*?)”匹配的也就是用户的昵称。

正则表达式是个好东西,不过博主是不怎么懂的,想学习的小伙伴可以自行查找资料,学有所成了记得来教教博主啊!感激不尽!

通过上述的代码我们可以获取当前页的所有段子,但是既然说是爬虫,我们的小虫子得主动出击啊,爬取一页之后应该去下一个页面继续工作。当然不是所有的网站都有类似“下一页”、“更多”这样的按钮的,那样的网站如何爬取遇到再说;幸运的是,糗百有啊,那我们还等什么,整!

上文说过,页面跳转的链接都在class为"pagination"的<ul>标签中,每个<li>标签都是一个地址链接,我们需要做的工作就是:

  1. 找到这个ul标签

  2. 找到ul标签下所有的li标签

  3. 从li标签中找到下一个页面的地址链接

这里给大家介绍一个简单粗暴的python库,叫 BeautifulSoup,使用这个库推荐安装lxml,安装命令当然是“pip install lxml”。

上代码:

获取class为pagination的ul标签,获取其中的页面跳转相关内容

        pagination = BeautifulSoup(html.text, 'lxml').find('ul', class_='pagination')
        #  获取pagination中所有的li标签,大多数最后一个标签都包含下一个页面的地址
        li = BeautifulSoup(str(pagination), 'lxml').find_all('li')
        next_pattern = re.compile('<a href="(.*?)" rel', re.S)
        # 检测最后一个li标签是否含有地址信息
        next = re.findall(next_pattern, str(li[-1]))
        # print(li)
        # 当下个页面链接不为空时,检测数据库中是否已经存在连接
        if next:
            print('the next page is:', next[-1])
            # 如果地址在库中存在,终止操作,否则拼接好url,继续执行后续操作
            if url_queue.find_by_id(next[-1]):
                break;
            # 地址信息入库
            info = {
                '_id': next[-1],
                'timestamp': datetime.now()
            }
            url_queue.push(info)
            next_url = base_url + next[-1]

        # 当下个页面链接为空时,退出循环
        else:
            print(r'I don\'t konw where to go : ', next)
            break

代码已上传csdn资源,大家可以免费下载,点击打开链接 欢迎大家拍砖~~~
最后再叮嘱一句:不要影响到人家网站的正常运营!

相关文章

  • 使用python爬取糗百段子

    博主CSDN昵称:守护者ly,欢迎大家前去指点最近在自学Python爬虫,写了一个小demo,前来现学现卖!感谢大...

  • Python 爬虫入门(一)——爬取糗百

    爬取糗百内容 GitHub 代码地址https://github.com/injetlee/Python/blob...

  • Python爬虫教程一爬取糗事百科段子

    这次为大家带来,Python爬取糗事百科的小段子的例子。 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一...

  • 爬糗事百科段子

    本人比较喜欢段子,平时也经常上糗百。所以这次作业也想尝试一下爬取糗百的内容。 网站链接:https://www.q...

  • Python爬虫实战

    注:采转归档,自己学习查询使用 Python爬虫实战(1):爬取糗事百科段子Python爬虫实战(2):百度贴吧帖...

  • 爬取糗百

    加载全文的时候,需要注意怎么 获取;

  • 1.爬取糗百段子

    python学习笔记 声明:学习笔记主要是根据廖雪峰官方网站python学习学习及博客 #糗百提取一页内容 # -...

  • Python爬虫之糗事百科段子写入MySQL数据库

    在《Python爬取糗事百科段子》这篇文章中,我们获取到了每一个段子的内容(content)、作者(auth)、作...

  • 【Python爬虫】糗百-文字版块

    **糗百-文字版块https://www.qiushibaike.com/text/爬取作者信息(头像/昵称/性别...

  • 使用scrapy 爬糗百

    自学Python,还在学习中,如有问题请留言,大家共勉 开发工具:PyCharm使用框架:srcapy 步骤 1 ...

网友评论

      本文标题:使用python爬取糗百段子

      本文链接:https://www.haomeiwen.com/subject/lrfgnttx.html