Python爬虫案例一:获取古诗文并按用户输入的作者名进行数据保存

前言:

1、什么是爬虫?
    也称为网页蜘蛛(Web Spider),通俗来说,解放人的双手, 去互联网获取数据, 以数据库, txt, excel, csv, pdf, 压缩文件, image, video, music保存数据。
    本质: 模拟浏览器, 向服务器发送网络请求, 接受服务器返回的数据,并保存数据。
2、爬虫的分类?
    A、通用爬虫(根据目标获取选项): 百度, google, 搜狗 bing ... 搜索引擎
    B、聚焦爬虫: 根据指定的目标,指定的内容,获取数据, 保存数据
3、网址的构成(了解)
    例如:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=张三
    A、协议部分:https / http  -- 超文本传输协议
    B、域名部分:www.baidu.com -- 【方便人记忆】
    C、路径部分:一层一层的信息
    D、参数部分:请求时候, 携带必要参数 -- &符号链接
4、爬虫四部曲:
    A、准备网址: 
    B、请求网址:  # 注意:请求成功 不一定 拿到数据
    C、解析数据: 
    D、保存数据: 
5、动态【异步】页面和静态【同步】页面  (数据加载方式)
静态页面----所需信息全部能找到   【同步请求】:发送请求后数据一次性返回过来,数据量小
动态页面---找不到或数据不全      【异步请求】:发送请求后数据没有一次性返回过来

源代码:

链接:https://www.gushiwen.cn/

import requests
from lxml import etree
class Two_Spider(object):
    def __init__(self):
        # self.keyword = input('请输入作者:')
        self.no = 1
        self.keyword = '白居易'
        self.start_url = 'https://so.gushiwen.cn/search.aspx?'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
        }

    def confirm_params(self):
        # 构造请求参数,保存3页
        for i in range(1, 4):
            params = {
                'type': 'author',
                'page': str(i),
                'value': self.keyword,
                'valuej': self.keyword[0]
            }
            self.request_start_url(params)


    def request_start_url(self, params):
        response = requests.get(self.start_url, headers=self.headers, params=params).text
        self.parse_response(response)

    def parse_response(self, response):
        # 解析响应
        A = etree.HTML(response)
        div_list = A.xpath('//div[@class="left"]/div[@class="sons"]')
        for div in div_list:
            # 标题
            bt = div.xpath('.//div[@class="cont"]/div[2]/p/a/b/text()')
            bt = ''.join(bt).strip()
            # 正文
            zw = div.xpath('.//div[@class="contson"]//text()')
            # 简单处理正文
            zw = ''.join(zw).split('。')
            # for 行 in zw:
            #     if '?' in 行:
            #         前面 = 行.split('?')[0] + '\n'
            #         后面 = 行.split('?')[1] + '\n'
            #         zw_list.append(前面)
            #         zw_list.append(后面)
            #     elif ')' in 行:
            #         前面 = 行.split(')')[0] + ')'
            #         后面 = 行.split(')')[1]
            #         zw_list.append(前面)
            #         zw_list.append(后面)
            #     else:
            #         zw_list.append(行)
            # zw_list = [i.strip() for i in zw_list]
            # zw_list = '\n'.join(zw_list)
            self.save_Data(bt, zw)

    def save_Data(self, bt, zw):
        # 保存数据
        with open(f'{self.keyword}.txt', 'a+', encoding='utf-8') as f:
            f.write(f'【第{self.no}首】' + '\n')
            f.write(f'{bt}' + '\n')
            f.write(f'{self.keyword}' + '\n')
            f.write(f'{zw}' + '\n')
            f.write('\n')
            f.write('---------------' * 15)
            f.write('\n')

        print('ok---第{}首:{}'.format(self.no, bt))
        self.no += 1

    def main(self):
        self.confirm_params()

if __name__ == '__main__':
    tw = Two_Spider()
    tw.main()

运行效果:

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值