【问题标题】:How to scrape pages with Selenium?如何使用 Selenium 抓取页面?
【发布时间】:2018-11-01 07:30:35
【问题描述】:

我想通过 Selenium 抓取一个网站,总共有 10 页。我的代码如下,但为什么我只能得到首页结果:

# -*- coding: utf-8 -*-
from selenium import webdriver
from scrapy.selector import Selector


MAX_PAGE_NUM = 10
MAX_PAGE_DIG = 3

driver = webdriver.Chrome('C:\Users\zhang\Downloads\chromedriver_win32\chromedriver.exe')
with open('results.csv', 'w') as f:
    f.write("Buyer, Price \n")

for i in range(1, MAX_PAGE_NUM + 1):
    page_num = (MAX_PAGE_DIG - len(str(i))) * "0" + str(i)
    url = "https://www.oilandgasnewsworldwide.com/Directory1/DREQ/Drilling_Equipment_Suppliers_?page=" + page_num

    driver.get(url)

    names = sel.xpath('//*[@class="fontsubsection nomarginpadding lmargin opensans"]/text()').extract()
    Countries = sel.xpath('//td[text()="Country:"]/following-sibling::td/text()').extract()
    websites = sel.xpath('//td[text()="Website:"]/following-sibling::td/a/@href').extract()

driver.close()
print(len(names), len(Countries), len(websites))

【问题讨论】:

    标签: python selenium scrapy


    【解决方案1】:

    我的猜测是,这与您在 page_num 分配中所做的奇怪事情有关。要调试,请在调用 driver.get(url) 后尝试添加此行:

    print(driver.current_url)
    

    如果它返回您期望的 URL,那么很可能问题出在您的 XPATH 中。

    【讨论】:

      【解决方案2】:

      首先,我使用find_elements_by_xpath 获取每个页面的名称、国家和网站,并将它们存储到一个列表中。从列表中的每个元素中提取文本,并将值添加到新列表中。

      from selenium import webdriver
      
      MAX_PAGE_NUM = 10
      
      driver = webdriver.Chrome('C:\\Users...\\chromedriver.exe')
      
      names_list = list()
      Countries_list = list()
      websites_list = list()
      
      # The for loop is to get each of the 10 pages
      for i in range(1, MAX_PAGE_NUM):
          page_num = str(i)
          url = "https://www.oilandgasnewsworldwide.com/Directory1/DREQ/Drilling_Equipment_Suppliers_?page=" + page_num
      
          driver.get(url)
      
          # Use "driver.find_elements" instead of "driver.find_element" to get all of them. You get a list of WebElements of each page
          names = driver.find_elements_by_xpath("//*[@class='fontsubsection nomarginpadding lmargin opensans']")
      
          # To get the value of each WebElement in the list. You have to iterate on the list 
          for i in range(0, len(names)):
          # Now you add each value into a new list 
              names_list.append(names[i].text)
      
      
          Countries = driver.find_elements_by_xpath("//td[text()='Country:']/following-sibling::td")
          for i in range(0, len(Countries)):
              Countries_list.append(Countries[i].text)
      
          websites = driver.find_elements_by_xpath("//td[text()='Website:']/following-sibling::td")
          for i in range(0, len(websites)):
              websites_list.append(websites[i].text)
      
      print(names_list)
      print(Countries_list)               
      print(websites_list)
      
      driver.close()
      

      我希望这对你有用

      选项:获取包含在<div class = border fontcontentdet> 上的部分中的所有数据。

      从硒导入网络驱动程序

      MAX_PAGE_NUM = 10
      
      driver = webdriver.Chrome('C:\\Users\\LVARGAS\\AppData\\Local\\Programs\\Python\\Python36-32\\Scripts\\chromedriver.exe')
      
      data_list = list()
      
      # The for loop is to get each of the 10 pages
      for i in range(1, MAX_PAGE_NUM):
          page_num = str(i)
          url = "https://www.oilandgasnewsworldwide.com/Directory1/DREQ/Drilling_Equipment_Suppliers_?page=" + page_num
          driver.get(url)
      
          rows = driver.find_elements_by_xpath("//*[@class='border fontcontentdet']")
      
          for i in range(0, len(rows)):
      
              print(rows[i].text)
      
              data_list.append(rows[i].text)
      
              print('---')
      
      driver.close()
      print(data_list)
      

      【讨论】:

      • 谢谢,它有效。但是你能告诉我原因吗,我认为是因为你添加了函数:for i in range(1, len(websites)): website_list.append(websites[i].text) and other two items.why?跨度>
      • 我在脚本中添加了一些 cmets。我希望它可以帮助您执行每条指令。 driver.find_elements 可帮助您在每个页面上获取您正在寻找的所有 WebElements。我复制了您使用的相同 XPath。我只是对它们进行了一些编辑。当您将一页的 WebElements 放入列表时,您无法同时获取该值。出于这个原因,我使用循环 For i in range (1, len(names))。在这里,i 给了我们一个数字,用于从列表 names[i] 中获取每个数字。然后使用 .text 获取每个 WebElement 的值,并将其添加到新列表中。
      • 其实有一点点错误。因为指令 range(1, len(names)) 从 1 开始与列表交互,但第一个元素是 0。所以,正确的指令是 range(0, len(names) )。我把它们改成了代码。
      • 非常感谢您的详细指导,先生。它很有帮助。但我还是有点麻烦,就是名称与正确的国家和网站不对应。那是因为有些名字没有网站或国家标记。所以当我们把结果放在一个表格中后,你会发现一切都是混乱的,所以你能帮助避免它。
      • 我添加了一个选项来获取目录中每个元素的所有信息。您会得到一个列表,您可以根据需要对其进行操作。
      猜你喜欢
      • 1970-01-01
      • 2019-10-27
      • 2018-06-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2022-08-14
      相关资源
      最近更新 更多