爬虫确定分页

2023-11-14

  1. 直接能确定分页数的直接根据分页num构造
  2. 导航栏目主页不能直接确定分页数,需要通过下一页来确定最后一页
这边主要介绍第二类如果下一页还存在,放进分页列表、就不是最后一页,如果不存在就是最后一页
import requests
import requests.sessions
from lxml import etree
import urllib3
import time
import ssl
import random
import os
import socket
import math
import re
from w3lib.html import remove_tags
from Database import Database

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"
}
ssl._create_default_https_context = ssl._create_unverified_context
urllib3.disable_warnings()


# 获取栏目列表
def get_category_url_list(url):
    res = session.get(url, headers=headers, verify=False, timeout=100)
    res.encoding = "utf-8"
    html = etree.HTML(res.text)
    category_url_list = html.xpath('//nav[@id="site-nav"]//a/@href')
    if len(category_url_list) != 0:
        category_url_list.pop(0)
        category_url_list.pop(0)
    # 如果category_url_list为[],就只有一个栏目,把url放进category_url_list里面
    if len(category_url_list) == 0:
        category_url_list.append(url)
    return category_url_list


def get_page_next(url):
    res = session.get(url, headers=headers, verify=False, timeout=100)
    res.encoding = "utf-8"
    html = etree.HTML(res.text)
    page_next = html.xpath('//a[@class="next page-numbers"]/@href')
    return page_next


# 获取每个栏目下面的分页列表
def get_page_url_list(url):
    page_url_list = []
    page_url_list.append(url)
    basic_url = url
    i = 1
    page_next = get_page_next(url)
    # 如果len(page_next) > 0,有下一页,就将url放入page_url_list
    while len(page_next) > 0:
        i = i + 1
        url = basic_url + "page/{}/"
        page_next = get_page_next(url.format(i))
        page_url_list.append(url.format(i))
    return page_url_list


# 获取每个栏目下面的每个分页里面的每个详情页列表
def get_detail_url_list(page_url_list, sleeptime, db, sql, domain):
    exception_page_url_list = []
    for i in page_url_list:
        try:
            res = session.get(i, headers=headers, verify=False, timeout=100)
            res.encoding = "utf-8"
            time.sleep(sleeptime)
            html = etree.HTML(res.text)
            detail_url_list = html.xpath('//h2[@class="entry-title"]//a/@href')
            print(detail_url_list)
            get_content_url_list(detail_url_list, db, sql, domain)
        except Exception as e:
            exception_page_url_list.append(i)
            # print(exception_page_url_list)
            print(e)
        continue


# 替换特殊字符
def replace_entity(str):
    CHAR_ENTITIES_dict = {
        " ": "",
        " ": "",
        " ": "",
        "&lt;": "<",
        "&gt;": ">",
        "&amp;": "&",
        "&quot;": '"',
        "&ldquo;": "“",
        "&rdquo;": "”",
        "&copy;": "©",
        "&reg;": "™",
        "&times;": "×",
        "&divide;": "÷",
        "&mdash;": "—"
    }
    for i in list(CHAR_ENTITIES_dict.keys()):
        if i in str:
            str = str.replace(i, list(CHAR_ENTITIES_dict.values())[list(CHAR_ENTITIES_dict.keys()).index(i)])
    return str


def filter_tag(html_str):
    # 去除script
    re_script = '<script[^>]*?>[\s\S]*?</script>'
    html_str = re.sub(re_script, "", html_str, re.S)
    # 只保留p、span、div标签
    html_str = remove_tags(html_str, which_ones=(), keep=("p", 'span', 'div'))
    html_str = html_str.lower()
    # 匹配换行、制表等空白字符
    re_blank = '\s*'
    # 去除样式
    re_style = r'style=".*?"'
    # 匹配class选择器相关内容
    re_class = r'class=[\"\'].*?[\"\']'
    # 匹配id选择器等内容
    re_id = r'id=".*?"'
    # 匹配可见的独立左右的样式等内容
    re_align = r'align=".*"'
    re_data_witdth = r'data-width=".*?"'
    # pip连续重复出现的<p>标签:类似于<p><p>,<p><p><p>若干个连续<p>字符串
    re_p_pre_repeat = "<p[><p]+p>"
    re_p_next_repeat = "</p[/p<>]+/p"
    html_str = re.sub(re_style, "", html_str)
    html_str = re.sub(re_blank, "", html_str)
    html_str = re.sub(re_class, "", html_str)
    html_str = re.sub(re_id, "", html_str)
    html_str = re.sub(re_data_witdth, "", html_str)
    # html_str = re.sub(re_center, "", html_str)
    html_str = re.sub(re_align, "", html_str)
    # .replace("<span>", "<p>").replace("</span>", "</p>")
    html_str = html_str.replace("翡翠王朝", "九玉网").replace(
        "www.jaadee.com", "www.91yu.com").replace("<div>",
                                                  "<p>").replace(
        "</div>", "</p>")
    html_str = re.sub(re_p_pre_repeat, "<p>", html_str)
    html_str = re.sub(re_p_next_repeat, "</p>", html_str)
    html_str = replace_entity(html_str)
    return html_str.replace(">>", ">").replace("<span></span>", "").replace("<p></p>", "").replace("翡翠产业网",
                                                                                                   "九玉网").replace(
        "http://fccyw.99114.com/", "www.91yu.com").lstrip().rstrip()


def get_data(content_url_list, domain):
    info = {}
    info["url"] = content_url_list[0]
    info["askreocrd"] = 0
    info["domain"] = domain
    content_all_list = []
    title_list = []
    for i in content_url_list:
        try:
            resp = session.get(i, headers=headers)
            resp.encoding = "utf-8"
            html = etree.HTML(resp.text)
            title = html.xpath('//h1/text()')[0]
            # title = re.findall('<div class="conl lf overf">.*<h1>(.*?)</h1>', resp.text)[0].lstrip().rstrip()
            title = re.sub(r'\s*', "", title)
            # print(title)
            title_list.append(title)
            content_list = re.findall(
                r'id="js_content".*?>(.*?)<div id="js_sponsor_ad_area"',
                resp.text, re.S)
            if len(content_list) == 0:
                content_list = re.findall(
                    r'class="single-content">(.*?)<div class="s-weixin">',
                    resp.text, re.S)
            content_all_list.append(content_list)
        except Exception as e:
            print(e)
        continue
    info["title"] = title_list[0]
    content_all_list = [i for k in content_all_list for i in k]
    info["content"] = ','.join(content_all_list)
    info["content"] = info["content"].replace(",", "")
    info_list = [info["title"], info["content"], info["url"], info["domain"], info["askreocrd"]]
    info_list[1] = filter_tag(info_list[1])
    return info_list


def insert_into_database(db, sql, values):
    is_exits = judge_title_is_exits(db, title=values[0])
    # 把数据插入数据库之前判断文章的标题是不是已经有,标题或者内容有一个为空不插入
    if is_exits == 0 and (values[0] != "" and values[1] != ""):
        print(values)
        values = tuple(values)
        sql = sql.format(values)
        try:
            db.insert(sql)
        except Exception as e:
            print(e)


# 判断标题数据库中是否存在
def judge_title_is_exits(db, title):
    judge_title_exits_sql = 'select 1 from cj_article WHERE cj_title = "{}" limit 1;'
    judge_title_exits_sql = judge_title_exits_sql.format(title)
    data = db.select(judge_title_exits_sql)
    # 如果数据库查询返回空元组,则不存在,将is_exits的值设为0
    if data == ():
        is_exits = 0
    else:
        is_exits = data[0][0]
    return is_exits


def get_content_url_list(detail_url_list, db, sql, domain):
    for i in detail_url_list:
        content_url_list = []
        try:
            response = requests.get(i, headers=headers, verify=False, timeout=100)
            response.encoding = "utf-8"
            html = etree.HTML(response.text)
            content_num = html.xpath('//div[@class="page5"]/a[1]/b[2]/text()')
            if len(content_num) == 0:
                content_url_list.append(i)
            else:
                for num in range(int(content_num[0])):
                    content_url_list.append(i.split(".html")[0] + "_" + str(num + 1) + ".html")
                    content_url_list[0] = i
            record = get_data(content_url_list, domain)
            insert_into_database(db, sql, record)
        except Exception as e:
            pass
        continue


if __name__ == '__main__':
    session = requests.Session()
    db = Database()
    insert_sql = "insert into cj_article (cj_title,cj_content,cj_url,cj_domain,cj_askrecord) values {}"
    url = 'http://www.fufeicui.com/'
    domain = url.replace("http://", "").split("/")[0]
    print(domain)
    category_url_list = get_category_url_list(url)
    print(category_url_list)
    sleeptime = 0
    for i in category_url_list:
        page_url_list = get_page_url_list(i)
        print(page_url_list)
        get_detail_url_list(page_url_list, sleeptime, db, insert_sql, domain)
    # 关闭数据库连接
    db.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫确定分页 的相关文章

随机推荐

  • matlab 计算协方差矩阵

    但是在有些用到协方差的算法中 分母使用了N 而不是N 1 但是由于样本很多 差别不大 gt gt v magic 3 v 8 1 6 3 5 7 4 9 2 gt gt cov v ans 7 8 1 8 16 8 1 8 7 gt gt
  • Base64编码工具类

    public class Base64Util private static final char last2byte char Integer parseInt 00000011 2 private static final char l
  • 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E0304 没有与参数列表匹配的 重载函数 "std::regex_match" 实例 Project16 D:\Program Files(x86)\Microsoft Visual Stu

    这个错误表示在你的代码中调用了一个名为 std regex match 的函数 但是在你的代码中并没有定义该函数的重载函数 没有参数列表与你调用的函数相匹配 这个错误发生在 Project16D Program Files x86 Micr
  • jstat命令

    文章目录 1 简介 2 常用选项示例 1 jstat class pid 2 jstat gc pid 3 jstat gcutil pid 4 其他命令 1 简介 jstat命令可以查看堆内存各部分的使用量 以及加载类的数量 命令的格式如
  • 推荐夸克和多御,非常的实用!

    一 多御浏览器 多御浏览器是一款集安全 速度 工具于一身的浏览器 它的界面简洁大方 干净利落 打开速度和加载速度都很快 并且注重浏览体验 浏览器常用的功能一应俱全 添加书签 夜间模式 视频下载 分享页面 密码锁屏等 保护你的隐私 满足你的需
  • Python之Pygame.rect函数

    1 参数设置 Pygame 通过 Rect 对象存储和操作矩形区域 一个 Rect 对象可以由 left top width height 几个值创建 Rect 也可以是由 Pygame 的对象所创建 它们拥有一个属性叫 rect 任何需要
  • svn使用中出现的错误

    svn虽然用过很多次 但是还是会遇到很多问题 因为有时候是为了使用而忽略了原因 这次使用svn出了很多错误 这里记录一下 1 注意 Tortoise SVN和eclipse SVN插件版本的匹配 出现问题 无法从仓库import 知道的有以
  • 怎么在浏览器中获取请求头Headers信息

    这里使用的是Chrome浏览器 打开你想查询的网站 按F12 或者鼠标右键一下选择检查 会弹出如下的审查元素页面 然后点击上方选项中的Network选项 此时在按Ctrl R 选择下方框中的第一个 单击 选择Headers选项 其中就会有R
  • 最简单三级管振荡分析(自由多谐振荡器电路)

    三极管震荡分析 1 电路 自由多谐振荡器电路 2 分析 摘抄于电子发烧友 最简单三极管震荡电路 http m elecfans com article 640326 html 由上图可见 这个电路是由两个非门 反相器 用电容C1 C2构成的
  • 无需训练,自动扩展的视觉Transformer来了

    来自德克萨斯大学奥斯汀分校 悉尼科技大学和谷歌的研究者提出了一个无需训练就能自动扩展框架 As ViT 其能以高效和有原则的方式自动发现和扩展 ViT 当前 Vision Transformers ViT 领域有两个主要的痛点 1 缺少对
  • 华为OD机试 - 污染水域(Java)

    题目描述 输入一行字符串 字符串可转换为N N的数组 数组可认为是一个水域 判断多少天后 水域被全部污染 数组中只有0和1 0表示纯净 1表示污染 每天只可污染上下左右的水域 如果开始全部被污染 或永远无法污染 则返回 1 输入描述 无 输
  • 顺序表算法:将2个有序顺序表合成一个有序的顺序表

    顺序表算法 设顺序表 A 元素的个数是 n 没有重复 如果 A 中前 k 个元 素有序 后 n k 个元素有序 设计一个算法使得整个顺序表有序 要求算法的空 间复杂度为 O 1 solution 由于题目要求空间复杂度为O 1 所以不能另外
  • 爬取微信好友的部分资料,并将所有人的个性签名制成词云图,哈哈~~~~

    import itchat itchat login friends itchat get friends update True 0 male female other 0 for i in friends 1 sex i Sex if
  • Linux云计算-02_CentOS Linux 7.X系统管理

    Linux系统安装完毕 需要对Linux系统进行管理和维护 让Linux服务器能真正应用于企业中 本章介绍Linux系统32位与64位区别 内核命名规则 引导原理 启动流程 TCP IP协议概述 IP地址及网络知识 CentOS 7密码重置
  • Windows libreOffice develpemet 搭建

    2020 7 10 Personal 7 1 参考 https wiki documentfoundation org Development lode https wiki documentfoundation org Developme
  • 使用 java 命令编译运行 java 程序

    java 编译的过程 就是将 java 项目从源文件变成 class 文件的过程 而 class 文件 最后会被加载到JVM 中运行 在 JDK bin 目录下 提供了 javac 命令 用于将 java 源文件编译成 class 字节码文
  • 贤者之路,Cuda block内部矩阵求逆,mxm矩阵 复杂度为O(m)

    在做线性变换上经常要用到NXN的矩阵求逆 在CUDA用的是高斯消元比较适合并行计算 下面是3X3Cuda实现矩阵求逆的Device函数 也就是说可以直接写到你的kernel函数上去 当然也可以是任何NXN矩阵 另外时间上 测试过6X6的矩阵
  • 解读YOLO v7的代码(三)损失函数

    在前两篇博客中我分析了YOLO v7的模型结构以及训练数据的准备 这里将对损失函数的代码进行分析 在train py中 我们可以看到以下的代码是进行损失值计算的 if loss ota not in hyp or hyp loss ota
  • 集成电路模拟版图入门-版图基础学习笔记(一)

    IC模拟版图设计 了解版图 版图的定义 版图是在掩膜制造产品上实现 电路功能且满足电路功耗 性能等 从版图上减少工艺制造对电路的偏差 提高芯片的精准性 版图的意义 1 集成电路掩膜版图设计师实现集成电路制造所必不可少的设计环节 它不仅关系到
  • 爬虫确定分页

    直接能确定分页数的直接根据分页num构造 导航栏目主页不能直接确定分页数 需要通过下一页来确定最后一页 这边主要介绍第二类如果下一页还存在 放进分页列表 就不是最后一页 如果不存在就是最后一页 import requests import