• spider爬虫练习,爬取顶点小说网,小说内容。


    ------------恢复内容开始------------

    我这里练习爬虫的网站是顶点小说网,地址如下:

    https://www.booktxt.net/

    我这里以爬取顶点小说网里面的凡人修仙传为例子:

    首先观察界面:

    第一章:

    第二章:

    由上面可得出规律,每点一次下一章,url后面的数字就会自动加1。

    爬虫主要分为3步:

    第一步:构建url列表

        def url_list(self):
            url = "https://www.booktxt.net/1_1562/{}.html"
            url_list = []
            for i in range(self.page):
                url_list.append(url.format(507240 + i))
            return url_list

    使用for循环,传入一个参数,没循环一次url后面的数字就会自动加1,把他放到一个新的url_list列表里面。

    第二步:发送请求,获取响应结果

        def send_request(self, url):
            res = requests.get(url, headers=self.headers)
            res.encoding = "GBK"
            html_str = res.text
            # 获取html对象
            html = etree.HTML(html_str)
            return html

    这里用到了requests库,需要传入一个url参数,返回html对象。

    第3步:解析返回的内容,使用xpath提取想要的数据

    for循环遍历url_list列表,同时调用send_request函数,传入url函数,遍历网址发送请求,返回html对象,通过xpath提取想要的数据。最后可以把解析出来的数据保存到本地

        def run(self):
            for url in self.url_list():
                print(url)
                html = self.send_request(url)
                html_tatle = html.xpath("//div[@class='bookname']/h1/text()")
                print(html_tatle[0])
    
                html_content = html.xpath("//div[@id='content']/text()")
    
                for content in html_content:
                    print(content)

    第4步:保存结果:

     # todo 保存
                with open('D:\Spider File\'+'{}.txt'.format(html_tatle), 'a+', encoding='utf-8') as f:
                    time.sleep(random.randint(3, 6))  # 增加爬取时间间隔,防止被封ip
                    f.write('	' * 3 + str(html_tatle) + '
    ')  # 章节名
                    for content in range(len(html_content)):    # 内容
                        f.write(' ' * 4 + html_content[content] + '
    ')

    运行结果如下:

    完整代码如下:

    import requests
    from lxml import etree
    import time,random
    import warnings
    requests.packages.urllib3.disable_warnings()
    
    
    class FictionSpider():
        def __init__(self, page):
            self.page = page
            self.headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
    
        def url_list(self):
            url = "https://www.booktxt.net/1_1562/{}.html"
            url_list = []
            for i in range(self.page):
                url_list.append(url.format(507240 + i))
            return url_list
    
        def send_request(self, url):
            res = requests.get(url, headers=self.headers,verify=False)
            res.encoding = "GBK"
            html_str = res.text
            # 获取html对象
            html = etree.HTML(html_str)
            return html
    
        def run(self):
            for url in self.url_list():
                print(url)
                html = self.send_request(url)
                html_tatle = html.xpath("//div[@class='bookname']/h1/text()")
                # print(html_tatle[0])
                html_content = html.xpath("//div[@id='content']/text()")
                # todo 保存
                try:
                    with open(r'D:\Spider File\'+'{}.txt'.format(html_tatle), 'a+', encoding='utf-8') as f:
                        time.sleep(random.randint(1, 3))  # 增加爬取时间间隔,防止被封ip
                        f.write('	' * 3 + str(html_tatle) + '
    ')  # 章节名
                        for content in range(len(html_content)):    # 内容
                            f.write(' ' * 4 + html_content[content] + '
    ')
                except Exception as e:
                    print("错误是:{}".format(e))
    
    
    
    
    if __name__ == '__main__':
        FictionSpider(608).run()
  • 相关阅读:
    运算符重载
    C++ 画星号图形——圆形(核心代码记录)
    C++ 画星号图形——空心三角形(星号左对齐)(核心代码介绍)
    C++ 画星号图形——空心三角形(星号居中对齐)(核心代码介绍)
    QMap迭代器
    QVector也是隐式数据共享的
    调试dump文件
    How does the compilation and linking process work?
    when to use reinterpret_cast
    构造类的时候,提供类型转换
  • 原文地址:https://www.cnblogs.com/xiamaojjie/p/12308319.html
Copyright © 2020-2023  润新知