• Geek_ccc0fd
    2023-05-06 来自广东
    新安装selemium的API变了,而且xpath获取的路径有点问题,我这里获取不到一页的全部内容,我修改了一下: title = driver.find_elements(By.XPATH, "//div[@class='feed-card-item']/h2/a[@target='_blank']") time = driver.find_elements(By.XPATH,"//div[@class='feed-card-item']/h2/../div[@class='feed-card-a feed-card-clearfix']/div[@class='feed-card-time']") 然后就是翻页点击那里我这边跑下来也有问题,根据xpath会获取两个a标签,所以需要增加索引: driver.find_elements(By.XPATH,"//div[@class='feed-card-page']/span[@class='pagebox_next']/a")[0].click()

    作者回复: 感谢分享您的经验。确实,Selenium 的 API 有时候会进行更新,需要根据新版本来进行调整。在具体实现中,我们需要结合页面的 HTML 结构来进行 xpath 路径的选择,以确保能够定位到正确的元素。对于一些可能存在多个元素的情况,使用索引可以确保点击到正确的元素,避免影响程序的正常执行。

    
    1
  • 未来已来
    2023-05-03 来自广东
    截止到 5月3日,新安装的 selemium 只有 find_elements 方法,老师的代码需改为: `title = driver.find_elements(By.XPATH, "//h2[@class='undefined']/a[@target='_blank']")` `time = driver.find_elements(By.XPATH, "//h2[@class='undefined']/../div[@class='feed-card-a feed-card-clearfix']/div[@class='feed-card-time']")` 以此类推

    作者回复: 感谢提醒,后续我会统一修改一下。

    
    1
  • Geek_ccc0fd
    2023-05-06 来自广东
    我们在parse里面可以直接使用response.xpath获取元素,和使用 driver.find_elements是同样的效果,为什么还要用selenium来做浏览器的操作呢?

    作者回复: 虽然在 Scrapy 中可以通过 `response.xpath` 直接获取网页元素,但是有时候网页内容是通过 JavaScript 动态加载的,此时 Scrapy 可能无法获取这些需要 JavaScript 执行后才能得到的内容。 而使用 Selenium 就可以完全模拟浏览器行为,包括 JavaScript 的执行,可以获取到完整的网页内容。此外,某些网站会通过一些反爬虫技术来检测访问者是否是真正的浏览器,如果检测到是爬虫,则会拒绝访问。使用 Selenium 可以完美地解决这个问题。

    
    
  • 安菲尔德
    2023-05-02 来自天津
    请问哪有main.py文件呢,没有看到

    作者回复: 同学,你好。 main.py文件是需要自己创建的。

    
    
  • peter
    2023-04-26 来自北京
    Q3:源码放在什么地方啊?能否把源码集中放到一个公共地方? 比如github等。

    作者回复: 同学你好,节后我会把源码放在github上,然后给你们链接。

    
    
  • peter
    2023-04-26 来自北京
    Q1:第七课,创建环境的最后几步,不停出错,最后一个错误是:执行“scrapy genspider sina_spider sina.com.cn”,报告:lib\string.py", line 132, in substitute return self.pattern.sub(convert, self.template) TypeError: cannot use a string pattern on a bytes-like object 网上搜了,大意说是python2和python3不匹配导致的。 我是完全按照老师的步骤来安装的,安装的是pythno3,怎么会有python2呢?当然,这个文件还没有解决,进行不下去了,郁闷啊。 Q2:能否建一个微信群?遇到问题可以协商。 另外,老师能否更及时地回复留言?

    作者回复: 关于第一个问题,看看能不能通过截图或者其他方式告诉我,关于微信群,我可以和官方商量一下,看看怎么搞。

    共 2 条评论
    
  • GAC·DU
    2023-04-26 来自北京
    老师,关于代码有些疑惑,第一:为什么parse_namedetail方法不再使用driver发起http请求和获取html标签内容? 第二:desc = response.xpath("//div[@class='article']/p/text()").extract() desc = selector.xpath("//div[@class='article']/p/text()").extract() 我测试了两个代码都可以使用,那为什么不直接使用response,反而要生成一个selector?

    作者回复: 同学你好,我来回答你的两个问题: A1:因为在parse_namedetail中已经获取到了http响应的内容,所以可以直接用,而不是再次请求网络,请求网络会有更多的耗时; A2:response对象包含来自Web服务器的HTML响应,并可用于提取响应数据,而selector对象是使用response对象创建的,它提供了一种方便的方法来从响应中选择和提取数据。因此,使用selector而不是response可以更方便地从HTML响应中提取和处理数据。

    
    
  • Weitzenböck
    2023-06-15 来自江苏
    如果出现这个错误:__init__() got an unexpected keyword argument 'chrome_options' 代码里改为 driver = webdriver.Chrome(options=self.option)具体源码是: class WebDriver(ChromiumDriver): """Controls the ChromeDriver and allows you to drive the browser.""" def __init__( self, options: Options = None, service: Service = None, keep_alive: bool = True, ) -> None: """Creates a new instance of the chrome driver. Starts the service and then creates new instance of chrome driver. :Args: - options - this takes an instance of ChromeOptions - service - Service object for handling the browser driver if you need to pass extra details - keep_alive - Whether to configure ChromeRemoteConnection to use HTTP keep-alive. """ self.service = service if service else Service() self.options = options if options else Options() self.keep_alive = keep_alive self.service.path = DriverFinder.get_path(self.service, self.options) super().__init__( DesiredCapabilities.CHROME["browserName"], "goog", self.options, self.service, self.keep_alive, )
    展开
    
    
  • alexliu
    2023-06-01 来自上海
    在运行下一页click()的时候,有可能出现ElementNotInteractableException错误,解决方案: 1、在driver.get(response.url)和click()后添加延时time.sleep(2) 2、保持chrome的窗口大小一致 self.option.add_argument("--window-size=1960,1080") try... except...部分代码如下: try: _next = driver.find_elements(By.XPATH, "//div[@class='feed-card-page']/span[@class='pagebox_next']/a") _next[0].click() _time.sleep(2) except StaleElementReferenceException as e: print(" page failed.", e) _next = driver.find_elements(By.XPATH, "//div[@class='feed-card-page']/span[@class='pagebox_next']/a") _next[0].click() _time.sleep(2) except ElementNotInteractableException as e: print(" not found page.", e) break except Exception as e: print("unkwon error: ", e)
    展开
    
    