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

2017-03-18  本文已影响44人  帅气的_xiang

目标:爬取百度糗事百科段子,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()
上一篇下一篇

猜你喜欢

热点阅读