首页 > 其他分享 >爬虫之利用selenium绕过js加载

爬虫之利用selenium绕过js加载

时间:2022-10-23 21:55:27浏览次数:55  
标签:name chrome selenium 爬虫 js options rar import id

契子

最近发现在ip被tx及其他大量收购,强取的背景下,网络小说很难诞生出有高质量的作品,为此,我计划爬取某个网站100本(再多就暴了)比较优质往年的小说解决精神上的匮乏

构思

  • 一个针对小说的下载函数rar_down
  • 筛选优质小说的函数score_select: 根据网友投票和自己的判断条件选择是否爬取

实现

  • 下载只需要用xpath爬取到下载地址,然后写入目录即可
    为了保护网站服务器网址就不放了
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
}

def rar_down(id, g:int, d:int):
    r = requests.get("http://baidu.php?id=" + str(id), headers = headers)
    html = etree.HTML(r.text)
    #名称处理
    nd = html.xpath('/html/head/title/text()')[0]
    name = ""
    for x in nd:
        if x == '《': continue
        else:
            if x == '》': break
            else: name += x
    name = str(g) + '_' + str(d) + '_' + name + '.rar'
    # rar链接
    dw = html.xpath('//span[@class="downfile"]')
    durl = etree.tostring(dw[0]).decode('utf-8')[32: -53]
    rar = r = requests.get(durl, headers = headers)

    with open('./' + name ,'wb') as code:
        code.write(rar.content)
    print(name + " down_complete!!!\n")
  • 选取: 在筛选评分的时候发现评分是js动态加载的,requests无法得到,试过requests-html也没有用,求助同学,突然想起来selenium可以动态加载(虽然时间复杂度肯定会变大了)
    解决思路:用上次学校打卡使用的selenimu+无可视化+find_element对得分获取与加工
def score_select(id):
    # 实现无可视化操作
    
    chrome_options  = webdriver.ChromeOptions()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    #chrome_options.add_argument("--no-sandbox")

    bro = webdriver.Chrome(chrome_options=chrome_options)
    


    bro.get("http://baidu/post/" + str(id))
    sleep(1)
    if '不要返回吗?' in bro.page_source: return
    good = int(bro.find_element(by=By.ID, value='moodinfo0').text)#find_element_by_id('moodinfo0').text)
    bad = int(bro.find_element(by=By.ID, value='moodinfo4').text)
    if good + bad < 50: return
    if (float(good) / bad) < 1.0 : return  
    
    rar_down(id, good, bad)
    global tol
    tol += 1
    bro.quit()

  • 最后是导入的包和main函数筛选代码
# -*- coding: UTF-8 -*-
import os
import requests
import lxml
from lxml import etree
from requests_html import HTMLSession
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import random
tol = 0


if __name__ == '__main__':
    st = [False] * 20001
    while tol < 100:
        id = random.randint(1, 20000)
        if st[id]: continue
        st[id] = True
        score_select(id)
    print("-----------------over------------")

大功告成

标签:name,chrome,selenium,爬虫,js,options,rar,import,id
From: https://www.cnblogs.com/InsiApple/p/16819707.html

相关文章

  • JSTL中taglib标签中uri和prefix的使用
    在早期的jsp开发中,是使用java代码来控制逻辑和显示的,但这样会给前端开发人员带来些麻烦并且代码的可读性也会降低。为了解决上述情况,标签库被创造出来了。标签库的目的在于......
  • #yyds干货盘点#JS中的map用法
    map()​​map()​​ 方法会返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。​​map​​​ 方法会给原数组中的每个元素都按顺序调用一次 ​​callback​​......
  • jsp 过滤器
    简介Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤......
  • JSP内置对象
    简介JSP的内置对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。在JSP页面中,可以通过存取JSP内置对象实现与JSP页面和Servlet环境......
  • Fastjson反序列化(一)
    前置知识Fastjson是一个Java库,可以将Java对象转换为JSON格式,当然它也可以将JSON字符串转换为Java对象。Fastjson可以操作任何Java对象,即使是一些预先存在......
  • selenium4-获取页面元素相关信息
    本小节我们简单说下如何使用selenium4-获取页面元素相关信息,以及获取页面元素的相关信息后可以做什么。获取页面元素的主要目的:(1)执行完步骤后进行断言;(2)获取前一步骤的响应......
  • jsp页面中的正则表达式--主要用于js判断文本格式
    一、方括号[]举例:二、^三、元字符举例的话,就可以这么说,要实现要表示整数的话:[]就表示输入的文本框里面的数字的第一位,可以这么写--->[1-9]然后已知\d表示的与[0-9......
  • js原生转码API
    encodeURIComponent(编码)letencodeBase=encodeURIComponent();decodeURIComponent(解码)letdecodeBase=decodeURIComponent();......
  • uWebSockets.js 遇见 Http3
    HTTP/3引入运行在UDP上的新(不同)传输协议QUIC意味着理论上和目前实验上的延迟减少,目前标准已发布,在开始之前可以参阅《​​​​WebSockets和HTTP​​》​​uWebSockets.......
  • JSON 和 JavaScript 介绍与区别
    Web开发依赖于JavaScript,但什么是JSON,以及JSON与JavaScript的区别是什么?了解WEB背后的技术对于寻求创新和充分利用可用资源的团队来说非常重要。所有与WEB相关的......