爬虫方式(模拟用户)

打印 上一主题 下一主题

主题 918|帖子 918|积分 2754

基于rake的爬取代码
  1. require 'nokogiri'
  2. require 'json'
  3. require 'open-uri'
  4. namespace :spider_sbi_code_info do
  5.   task table_data: :environment do
  6.     options = Selenium::WebDriver::Chrome::Options.new
  7.     options.add_argument('--headless') # 无头模式,不显示浏览器界面
  8.     driver = Selenium::WebDriver.for :chrome, options: options
  9.     csv_filename_list = ["table_data_0_普通株式.csv", "table_data_1_米国ETF.csv", "table_data_2_各国ADR.csv"]
  10.     begin
  11.       # 初始化文件
  12.       csv_filename_list.each do |file|
  13.         if File.exist?("db/csv/#{file}")
  14.           File.delete("db/csv/#{file}")
  15.           p "删除已存在的文件 #{file}"
  16.         end
  17.       end
  18.       # 访问目标网站
  19.       url = 'https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_usequity_list.html'
  20.       driver.get(url)
  21.       dropdowns = driver.find_elements(css: '.form-control.input-sm')
  22.       # 遍历每个下拉列表并选择选项为 "-1"
  23.       dropdowns.each do |dropdown|
  24.         if dropdown.tag_name == 'select'
  25.           # 初始化 Select 对象
  26.           select = Selenium::WebDriver::Support::Select.new(dropdown)
  27.           # 通过 value 属性选择选项为 "-1"
  28.           select.select_by(:value, '-1')
  29.         end
  30.       end
  31.       # 等待页面加载完全
  32.       wait = Selenium::WebDriver::Wait.new(timeout: 10)
  33.       wait.until { driver.execute_script('return document.readyState') == 'complete' }
  34.       # 获取页面内容
  35.       html_content = driver.page_source
  36.       doc = Nokogiri::HTML(html_content)
  37.       tables = doc.css('.foo_table, div.accTbl01 > table[summary="layout"]')
  38.       if tables.any?
  39.         # 提取表格数据并写入 CSV 文件
  40.         tables.each_with_index do |table, index|
  41.           # 提取表格数据
  42.           table_data = table.css('tr').reject do |row|
  43.             index > 2 && row.css('th, td').map(&:text) == ["ティッカー", "銘柄(英語)", "事業内容", "市場"]
  44.           end.map { |row| row.css('th, td').map { |cell| cell.text.gsub("\n", '') } }
  45.           # 确定 CSV 文件名
  46.           csv_filename = if index > 2
  47.                            "db/csv/#{csv_filename_list.last}"
  48.                          else
  49.                            "db/csv/#{csv_filename_list[index]}"
  50.                          end
  51.           # 写入 CSV 文件
  52.           CSV.open(csv_filename, 'a') do |csv|
  53.             table_data.each { |row| csv << row }
  54.           end
  55.           p "存入数据到 #{csv_filename}"
  56.         end
  57.       else
  58.         p "没有找到表格"
  59.       end
  60.       title = "SBI証券取扱銘柄リスト一覧の送付_#{Date.today.strftime('%Y/%m/%d')}"
  61.       content = "関係者各位
  62. お疲れ様です。
  63. SBI証券のサイトより、取扱銘柄一覧をスクレイピングしましたので、
  64. メールにて送付させて頂きました。
  65. スクレイピング先のURL:
  66. https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_usequity_list.html

  67. ご確認をお願い致します。"
  68.       attachments = csv_filename_list.map { |filename| File.join('db/csv', filename) }
  69.       ExtMail.send_mail(title: title, body: content, template_name: 'system_mail', attachments: attachments, to: Yml::MAIL[:spider_sbi_stocks][Rails.env])
  70.       csv_filename_list.each do |file|
  71.         if File.exist?("db/csv/#{file}")
  72.           File.delete("db/csv/#{file}")
  73.           p "删除已存在的文件 #{file}"
  74.         end
  75.       end
  76.     rescue Exception => e
  77.       p "发生错误: #{e.message}"
  78.     ensure
  79.       driver.quit if driver
  80.     end
  81.   end
  82. end
复制代码
  1.   options = Selenium::WebDriver::Chrome::Options.new
  2.   options.add_argument('--headless') # 无头模式,不显示浏览器界面
  3.   driver = Selenium::WebDriver.for :chrome, options: options
复制代码
配置并启动 Selenium WebDriver:

  • Selenium::WebDriver::Chrome::Options.new 创建一个 Chrome 浏览器的选项实例。
  • options.add_argument('--headless') 添加一个选项,使浏览器以无头模式运行(不显示界面)。
  • Selenium::WebDriver.for :chrome, options: options 启动 Chrome 浏览器并应用这些选项。
  1. dropdowns = driver.find_elements(css: '.form-control.input-sm')
复制代码
找到页面上的所有下拉列表元素:

  • driver.find_elements(css: '.form-control.input-sm') 利用 CSS 选择器找到页面上所有具有 form-control input-sm 类的元素。
  1. dropdowns.each do |dropdown|
  2.         if dropdown.tag_name == 'select'
  3.           select = Selenium::WebDriver::Support::Select.new(dropdown)
  4.           select.select_by(:value, '-1')
  5.         end
  6.       end
复制代码
遍历每个找到的下拉列表,并选择值为 -1 的选项:

  • dropdowns.each do |dropdown| 迭代每个下拉列表。
  • if dropdown.tag_name == 'select' 检查元素是否是 select 标签。
  • select = Selenium::WebDriver::Support::Select.new(dropdown) 创建一个新的 Select 对象。
  • select.select_by(:value, '-1') 通过 value 属性选择值为 -1 的选项。
  1. wait = Selenium::WebDriver::Wait.new(timeout: 10)
  2. wait.until { driver.execute_script('return document.readyState') == 'complete' }
复制代码
等待页面完全加载:

  • wait = Selenium::WebDriver::Wait.new(timeout: 10) 创建一个新的 Wait 对象,设置超时时间为 10 秒。
  • wait.until { driver.execute_script('return document.readyState') == 'complete' } 等待页面的 readyState 变为 complete,表示页面加载完成。
  1. html_content = driver.page_source
  2. doc = Nokogiri::HTML(html_content)
复制代码
这段代码获取页面内容并利用 Nokogiri 解析:

  • html_content = driver.page_source 获取当前页面的 HTML 源代码。
  • doc = Nokogiri::HTML(html_content) 利用 Nokogiri 解析 HTML 内容,创建一个文档对象。
  1. tables = doc.css('.foo_table, div.accTbl01 > table[summary="layout"]')
复制代码
这行代码利用 CSS 选择器找到页面上的特定表格:

  • tables = doc.css('.foo_table, div.accTbl01 > table[summary="layout"]') 找到具有特定 CSS 类和属性的表格元素

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表