美文网首页
实战1——爬取百度糗事百科段子

实战1——爬取百度糗事百科段子

作者: 帅气的_xiang | 来源:发表于2017-03-18 16:43 被阅读44次

    目标:爬取百度糗事百科段子,url 为http://www.qiushibaike.com/,爬取前20个网页中每个网页的每个段子的发布人、段子内容、点赞数、评论数,然后把内容保存在一个 BaiduQiushi.txt 文件中。

    一、 分析网页结构


    通过分析 url 可以发现规律,使用该规律来实现换页功能。
    即:” http://www.qiushibaike.com/8hr/page/” + pagenum +”/?s=4966067”

    然后查看页面源代码,辅助 chrome 审查元素元素功能快速定位所需内容位置。
    可以发现,每个段子都是包括在div 标签内的。

    发布人:

    段子内容:

    点赞数:

    评论数:

    二、 确定使用技术路线

    这里获取内容的方式有很多种,可以使用 requests + re 。也可是使用 beautifulsoup。
    不过感觉这个例子比较小,我就只使用了 requests 和 re 来实现。

    三、 步骤

    1. 实现换页功能,生成 url 列表 urls。
    2. 遍历 urls 这个列表,解析每个页面的 html 源代码。
    3. 对于每个 html,获得发布人模块,放置在 everyblock 列表中。
    4. 遍历每个 everyblock 列表,提取每个段子的发布人、段子内容、点赞数、评论数

    四、 代码

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/3/18 15:10
    # @Author  : zxp
    # @Site    : 
    # @File    : zxp_CrowBaiduQiushi.py
    # @Software: PyCharm Community Edition
    import requests
    import re
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            print url + ':获取失败!'
    
    def getEveryBlock(html):
        everyblock = re.findall('(<div class="article block untagged mb15".*?<div class="single-clear"></div>)', html, re.S)
        return everyblock
    
    def getInfo(block):
        info = {}
        info['author'] = re.search('<h2>(.*?)</h2>', block, re.S).group(1)
        info['content'] = re.search('<span>(.*?)</span>', block, re.S).group(1)
        likeandcomment = re.findall('<i class="number">(.*?)</i>', block, re.S)
        info['like'] = likeandcomment[0]
        if len(likeandcomment) == 1:
            info['comment'] = '0'
        else:
            info['comment'] = likeandcomment[1]
        return info
    
    def saveAllInfo(all_info):
        f = open('BaiduQiushi.txt', 'a')
        for each in all_info:
            f.writelines('author:' + each['author'] + '\n')
            f.writelines('content:' + each['content'] + '\n')
            f.writelines('like:' + each['like'] + '\n')
            f.writelines('comment:' + each['comment'] + '\n\n')
        f.close()
    
    def main():
        urls = []
        all_info = []
        pagenum = 20
        for i in xrange(1, pagenum + 1):
            url = 'http://www.qiushibaike.com/8hr/page/' + str(i) + '/?s=4966067'
            urls.append(url)
        for url in urls:
            html = getHTMLText(url)
            everyblock = getEveryBlock(html)
            for each in everyblock:
                info = getInfo(each)
                all_info.append(info)
        saveAllInfo(all_info)
    
    
    if __name__ == '__main__':
        main()
    

    相关文章

      网友评论

          本文标题:实战1——爬取百度糗事百科段子

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