会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 133539个问题
JAVA 全系列/第十四阶段:分布式文件存储与数据缓存/FastDFS 30361楼
WEB前端全系列/第九阶段:HTML5新特性模块/(旧)H5新特性 30362楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/面向对象详解和JVM底层内存分析 30363楼

之前用request爬取猫眼电影时,

由于猫眼把电影信息变成了动态获取,因此无法直接用源代码爬取。

现在通过selenium直接点进电影信息时发现,

即使首页面加了防检测,但只能在当前页面生效,打开的新页面window.navigator.wevdrive===True,依旧无法获取电影信息,因此仍无法用selenium获取多条电影信息。

因此通过request爬取电影目录,selenium爬取电影信息,总算是成功爬取了电影信息,目前猫眼评分转了码问题仍未解决

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from time import sleep
import requests
from fake_useragent import UserAgent
from lxml import etree
from queue import Queue
from threading import Thread


def get_film_list(page):
    film_list = []
    for i in range(page):
        url = f'https://www.maoyan.com/films/?showType=3&offset={30*i}'
        headers = {'User-Agent': UserAgent().chrome}
        resp = requests.get(url, headers = headers)
        html = etree.HTML(resp.text)
        films = html.xpath('//dd/div[@title]/a/@href')
        for film in films:
            film_list.append(film)
        sleep(1)
    return film_list


def get_film_data(film):
    url = f'https://www.maoyan.com{film}'
    options = webdriver.ChromeOptions()
    # 设置无头
    options.add_argument('--headless')
    # 防检测1
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    options.add_experimental_option('useAutomationExtension', False)

    service = Service(executable_path='./tools/chromedriver')
    chrome = webdriver.Chrome(service=service, options=options)
    chrome.implicitly_wait(2)

    # 防检测2
    chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
              get: () => false
            })
          """
    })

    chrome.get(url)
    name = chrome.find_element(By.XPATH, '//h1[@class="name"]').text
    type_ = [i.text for i in chrome.find_elements(By.XPATH, '//a[@class="text-link"]')]
    chrome.find_element(By.XPATH, '//div[@class="tab-title "]').click()
    actors = []
    for i in chrome.find_elements(By.XPATH, '//li[@class="celebrity actor"]/div/a'):
        if i.text and i.text not in actors:
            actors.append(i.text.strip())

    info = {'电影名': name, '类型': type_, '主演': actors}
    return info


def create_quere(list):
    q = Queue()
    for i in list:
        q.put(i)
    return q


class MyThread(Thread):
    def __init__(self, q):
        Thread.__init__(self)
        self.__q = q

    def run(self) -> None:
        while not self.__q.empty():
            film = self.__q.get()
            film_info = get_film_data(film)
            print(film_info)


if __name__ == '__main__':
    film_list = get_film_list(1)
    q = create_quere(film_list)
    for i in range(3):
        t = MyThread(q)
        t.start()


Python 全系列/第十六阶段:Python 爬虫开发/爬虫基础(旧) 30364楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/面向对象详解和JVM底层内存分析 30365楼
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 30366楼
JAVA 全系列/第五阶段:网页编程和设计/JavaScript语言 30368楼

2020 12 20----------

package com.bjsxt.schema;

import java.io.File;
import java.io.IOException;

import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

public class Test {
   public static void main(String[] args) throws SAXException {
      //(1)创建SchemaFactory工厂
      SchemaFactory sch=SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
      //(2)建立验证文件对象
      File schemaFile=new File("book.xsd");
      //(3)利用SchemaFactory工厂对象,接收验证的文件对象,生成Schema对象
      Schema schema=sch.newSchema(schemaFile);
      //(4)产生对此schema的验证器
      Validator validator=schema.newValidator();
      //(5)要验证的数据(准备数据源)
      Source source=new StreamSource("book.xml");
      //(6)开始验证
      try {
         validator.validate(source);
         System.out.println("成功");
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         System.out.println("失败");
      }
   }
}
"C:\Program Files\Java\jdk1.8.0_261\bin\java.exe" "-javaagent:E:\IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=50729:E:\IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=GBK -classpath "C:\Program Files\Java\jdk1.8.0_261\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\rt.jar;E:\IDEA\第三阶段\out\production\schemaProject" com.bjsxt.schema.Test
Exception in thread "main" org.xml.sax.SAXParseException; schema_reference.4: 无法读取方案文档 'file:/E:/IDEA/%E7%AC%AC%E4%B8%89%E9%98%B6%E6%AE%B5/book.xsd', 原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是 <xsd:schema>。
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:135)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:396)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:306)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:4207)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:4190)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument1(XSDHandler.java:2513)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:2220)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:581)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:610)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:569)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:535)
	at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:269)
	at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:638)
	at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:654)
	at com.bjsxt.schema.Test.main(Test.java:21)
Caused by: java.io.FileNotFoundException: E:\IDEA\第三阶段\book.xsd (系统找不到指定的文件。)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:622)
	at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:150)
	at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:583)
	at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:686)
	at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaDOMParser.parse(SchemaDOMParser.java:531)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:2208)
	... 8 more

Process finished with exit code 1

schemaProject.zip

$5`0832T0CDYF5[$7B[JHLW.png

运行不了..

JAVA 全系列/第二阶段:JAVA 基础深化和提高/XML 技术(旧) 30369楼
Python 全系列/第一阶段:Python入门/编程基本概念 30370楼

''''
使用工厂模式、单例模式实现如下需求:
(1) 电脑工厂类 ComputerFactory 用于生产电脑 Computer。工厂类使用单例模式,也就是说只能有一个工厂对象。
(2) 工厂类中可以生产各种品牌的电脑:联想、华硕、神舟
(3) 各种品牌的电脑使用继承实现:
(4) 父类是 Computer 类,定义了 calculate 方法
(5) 各品牌电脑类需要重写父类的 calculate
'''
class Computer:
    __obj=None
    __init__flag=True
    def create_computer(self,brand):
        if brand=='联想':
            return Lenovo(Computer)
        if brand=='华硕':
            return Asus(Computer)
        if brand=='神舟':
            return Hasee(Computer)
        else:
            return '未知品牌,无法创建'
    def calculate(self):
        print('生产电脑')
    def __new__(cls, *args, **kwargs):
        if cls.__obj==None:
            cls.__obj=object.__init__(cls)
            return cls.__obj
    def __init__(self,brand):
        if self.__init__flag:
            print('init...')
            self.__init__flag=False

class Lenovo(Computer):
    def calculate(self):
        print('生产联想电脑')
class Asus(Computer):
    def calculate(self):
        print('生产华硕电脑')
class Hasee(Computer):
    def calculate(self):
        print('生产神舟电脑')
factory=Computer()
factory2=Computer()
x=factory.create_computer('联想')

image.png

老师,我这个代码一直报错,看了问答区感觉我代码好像没错啊

Python 全系列/第一阶段:Python入门/面向对象 30372楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/数据结构 30373楼

'''测试一个经典的GUI程序的写法,用面向对象的的方式'''
from tkinter import *

from tkinter import  messagebox
class Appclation(Frame):
    """一个经典的GUI程序的写法"""
    def __init__(self,master=None):
        super().__init__(master)  # super()代表的是父类的定义而不是父类的对象
        self.master=master
        self.pack()
        self.createwidget()
        self.creatwidget2()
    def createwidget(self):
        """  创建lable对象"""
        self.labeo1=Label(self,text='百战程序员',width=10,height=2,bg="black",fg="white")
        self.labeo1.pack()
        self.labeo2=Label(self,text="赵少斯",width=10,height=2,bg='blue',fg="white",font=("黑体",30))
        self.labeo2.pack()
        self.labeo3=Label(self,text='赵少斯好帅\n王杰好丑\n王杰',borderwidth=2,justify="right",relief='solid')
        #创建一个退出按钮
        self.bton1quit=Button(self,text="点击退出",command=root.destroy)
        self.bton1quit.pack() #显示对象
    def creatwidget2(self):
        '''创建组件'''
        self.button2=Button(self)
        self.button2['text']="点击送花"
        self.button2.pack()
        self.button2['command']=self.songhua()
    def songhua(self):
        messagebox.showinfo("你好呀",'给你花')



if __name__ == '__main__':

    root=Tk()
    root.title("一个经典的Lable程序的测试")
    root.geometry("500x800+100+200")
    app=Appclation(master=root)
    root.mainloop()


老师,为啥会同时出现  怎样才能点击组件才能出现第二个


图片.gif

















































Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 30374楼

老师当提交表单之后,发生以下异常:

队列里面有一个我未知的消费者,实体类实现了序列化,网上看了很多原因都说是配置文件的链接工厂那里有问题,可是我直接粘贴老师的原文件呀不曾改动,求老师帮忙解答


image.png

控制台打印日志

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Spring 容器启动。。。。。。
javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: com.bjsxt.Users
	at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36)
	at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:193)
	at com.bjsxt.listener.MyMessageListener.onMessage(MyMessageListener.java:28)
	at org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:214)
	at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:674)
	at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:634)
	at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:605)
	at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308)
	at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:246)
	at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1144)
	at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1136)
	at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1033)
	at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.ClassNotFoundException: com.bjsxt.Users
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:468)
	at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.load(ClassLoadingAwareObjectInputStream.java:87)
	at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:46)
	at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2028)
	at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1895)
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2202)
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1712)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:519)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:477)
	at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:191)
	... 11 more
null


image.png

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:jms="http://www.springframework.org/schema/jms" 
   xmlns:amq="http://activemq.apache.org/schema/core"
   xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/jms
      http://www.springframework.org/schema/jms/spring-jms.xsd
      http://activemq.apache.org/schema/core
      http://activemq.apache.org/schema/core/activemq-core.xsd">
   <!-- 需要创建一个连接工厂,连接ActiveMQ. ActiveMQConnectionFactory. 需要依赖ActiveMQ提供的amq标签 -->
   <!-- amq:connectionFactory 是bean标签的子标签, 会在spring容器中创建一个bean对象.
      可以为对象命名. 类似: <bean id="" class="ActiveMQConnectionFactory"></bean>
    -->
   <amq:connectionFactory brokerURL="tcp://192.168.88.101:61616"
      userName="admin" password="admin" id="amqConnectionFactory"/>

   <!-- spring管理JMS相关代码的时候,必须依赖jms标签库. spring-jms提供的标签库. -->
   <!-- 定义Spring-JMS中的连接工厂对象
      CachingConnectionFactory - spring框架提供的连接工厂对象. 不能真正的访问MOM容器.
         类似一个工厂的代理对象. 需要提供一个真实工厂,实现MOM容器的连接访问.
    -->
   <bean id="connectionFactory"
      class="org.springframework.jms.connection.CachingConnectionFactory">
      <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
      <property name="sessionCacheSize" value="3"></property>
   </bean>

   
   <!-- 注册监听器 -->
   <!-- 开始注册监听. 
      需要的参数有:
         acknowledge - 消息确认机制
         container-type - 容器类型 default|simple
         simple:SimpleMessageListenerContainer最简单的消息监听器容器,只能处理固定数量的JMS会话,且不支持事务。
         default:DefaultMessageListenerContainer是一个用于异步消息监听器容器 ,且支持事务         
         destination-type - 目的地类型. 使用队列作为目的地.
         connection-factory - 连接工厂, spring-jms使用的连接工厂,必须是spring自主创建的
         不能使用三方工具创建的工程. 如: ActiveMQConnectionFactory.
    -->
   <jms:listener-container acknowledge="auto" container-type="default"
      destination-type="queue" connection-factory="connectionFactory" >
      <!-- 在监听器容器中注册某监听器对象.
         destination - 设置目的地命名
         ref - 指定监听器对象
       -->
      <jms:listener destination="test-spring" ref="myListener"/>
   </jms:listener-container>
   
</beans>


在网上看见的解决方案

image.png



JAVA 全系列/第十二阶段:消息中间件(异步消息传递)/ActiveMQ 30375楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637