2.3 案例5:爬取某糗事内容

课前说明:本章节请求的 url 部分用 ** 代替

爬虫分三个模块:

       1、请求模块:用于构造请求体,并将请求到的网页(数据)返回给解析模块;

       2、解析模块:用于提取数据(本章节用xpath提取网页中的数据),并返回数据给存储模块;

       3、存储模块:将数据存储在 json 文件中。

案例简介:

       用于抓取网页  https://www.qiushibai**.com/text/page/%d/ 发布糗事的作者,年纪,糗事内容等。

简单解析一下爬虫的思路:

       1、访问链接: https://www.qiushibai**.com/text/page/%d/  检查该网站是否动态加载网站;

       2、用xpath 解析网页内容;

       3、将爬取到的数据存储到 json 文件中;

       4、撰写爬虫代码,具体代码如下:

import json
from time import sleep
from urllib import request

from lxml import etree


# 请求模块
def request_handle(url, page):
    new_url = url % page
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
    }
    return request.Request(url=new_url, headers=headers)


def request_html(url, start, end):
    for page in range(start, end + 1):
        req = request_handle(url, page)
        res = request.urlopen(req)
        sleep(1)
        yield res.read().decode('utf-8')


# 解析模块
def analysis_html(html_list):
    for html in html_list:
        html_tree = etree.HTML(html)
        div_list = html_tree.xpath("//div[@id='content-left']/div")
        for div in div_list:
            item = {}
            item['author'] = div.xpath(".//a/h2/text()")[0]
            item['avatar'] = 'https:' + div.xpath(".//a/img/@src")[0]
            age = div.xpath(".//div[@class='articleGender manIcon']/text()")
            item['age'] = age[0] if len(age) > 0 else None
            item['content'] = div.xpath(".//a/div[@class='content']/span/text()")[0]
            comment = div.xpath(".//a/i/text()")
            item['comment'] = comment[0] if len(comment) > 0 else None
            yield item


# 存储模块
def save_json(data):
    with open('./qiushi.json', 'a+') as fp:
        for item in data:
            fp.write(json.dumps(item, ensure_ascii=False))


def main():
    url = 'https://www.qiushibai**.com/text/page/%d/'
    start = int(input('请输入起始页码:'))
    end = int(input('请输入终止页码:'))
    # 请求
    html_list = request_html(url, start, end)
    # 解析
    data = analysis_html(html_list)
    # 存储
    save_json(data)


if __name__ == '__main__':
    main()

温馨提示:不记得 xpath 的同学可以复习一下 1.7 认识网页解析工具哦n(*≧▽≦*)n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值