`

基于ruby Mechanize的爬虫

阅读更多

  def self.sang_carwler
    agent = Mechanize.new
    cc1 = ConsumableCategory.find_or_create_by(name: "生命科学", parent_id: 0)
    resp = agent.get("https://www.XXX.com").search("li.subnav_cat dl.sub_dl")
    resp.each do |e1|
      catalog_name2 = e1.search(".sub_dt a").first.children.first.text.strip
      next unless ["生化试剂", "分子生物学", "蛋白质科学", "抗体", "细胞生物学"].include?(catalog_name2)
      cc2 = ConsumableCategory.find_or_create_by(name: catalog_name2, parent_id: cc1.id)
      e1.search(".sub_dd a").each do |e2|
        catalog_name3 = e2.children.first.text.strip
        cc3 = ConsumableCategory.find_or_create_by(name: catalog_name3, parent_id: cc2.id)
      end
    end
  end

--------------

  # 基于接口的查询
  def self.guoyao_crawler(titles = [])
    menu_resp = HTTParty.get "https://XXX/reagent-front/indexApi/goodsClassList"
    menu_resp["data"].each do |catalog_1|
      next unless titles.include?(catalog_1["gcName"])
      cc1 = ConsumableCategory.find_or_create_by(name: catalog_1["gcName"], parent_id: 0)
      catalog_1["classList"].each do |catalog_2|
        next if catalog_1["gcName"] == "化学试剂" && ["通用试剂", "高纯试剂", "色谱应用", "分析标准品"].include?(catalog_2["gcName"])
        cc2 = ConsumableCategory.find_or_create_by(name: catalog_2["gcName"], parent_id: cc1.id)
        catalog_2["classList"].each do |catalog_3|
          cc3 = ConsumableCategory.find_or_create_by(name: catalog_3["gcName"], parent_id: cc2.id)
          if catalog_1["gcName"] == "化学试剂"
            page_size = 100
            page_no = 1
            flag = true
            while flag do
              chemical_resp = HTTParty.get "https://XXX/reagent-front/goodsApi/getGoodsList?pageSize=#{page_size}&pageNo=#{page_no}&searchType=gcIdSearch&keyword=#{catalog_3['gcId']}"
              if chemical_resp["data"].first["pageCount"].to_i > 0
                chemical_resp["data"].first["listApiGoods"].each do |goods|
                  MenuChemical.find_or_create_by(consumable_category_id: cc3.id, cas: goods["casIndexNo"])
                end
                page_no += 1
              else
                flag = false
              end
            end
          end
        end
      end
    end
  end

--------------

    def self.worm(sleep_second = 0.15)
      agent = Mechanize.new
      ['nav-1', 'nav-2', 'nav-3', 'nav-4'].each do |nav|
        agent.get("http://www.xxxx/zh_cn/").search("li.level0.#{nav} ul li ul li a").each do |link1|
          puts "#{link1.attributes['href'].value} #{link1.children.children.text}"
          fenlei = link1.children.children.text
          product_list = agent.get(link1.attributes['href'].value)
          total_count = product_list.search(".toolbar-number").last&.children&.text.to_i
          total_page = total_count % 15 == 0 ? (total_count / 15) : ((total_count / 15) + 1)
          (1..total_page).to_a.each do |page|
            product_list = agent.get("#{link1.attributes['href'].value}?p=#{page}")
            break if product_list.search('div.actions-primary a').blank?
            product_list.search('div.actions-primary a').each do |product_link|
              sleep sleep_second
              product_page = agent.get(product_link.attributes['href'].value)
              product_no = product_link.attributes['href'].value.gsub('http://www.xxx/zh_cn/','').gsub('.html', '').upcase
              cas = product_page.search("#product_addtocart_form > div.product-shop > div.product-info > span:nth-child(2) > a").children.text
              if product_page.search("#super-product-table thead tr").children.select{|c| c.name == 'th'}.map{|th| th.children.text.to_s.strip} == ["货号", "规格", "库存", "价格", "数量"]
                product_page.search("#super-product-table tbody tr").each do |tr|
                  tds = tr.children.select{|c| c.name == 'td'}
                  package_unit = tds[0].children.text.to_s.strip.gsub("#{product_no}-",'')
                  package = package_unit.to_f
                  unit = package_unit.slice(/[a-zA-Z]+/).downcase
                  purity = tds[1].children.text.to_s.strip
                  stock = tds[2].children.text.to_s.strip
                  ajax_price_id = tds[3].attributes['attr'].value
                  price = 0
                  response = HTTParty.post("http://www.xxx/zh_cn/catalogb/ajax/price", body: {ajax_price_id => ajax_price_id})
                  price = Nokogiri::HTML(JSON.parse(response.parsed_response)[ajax_price_id]).search("p span.price").last.text.gsub(/[^0-9]/,'').to_f / 100 if response&.parsed_response.present?
                  ReagentCategory.create(name: 'ald', fenlei: fenlei, product_no: product_no, cas: cas, package: package, unit: unit, stock: stock, price: price, purity: purity, ajax_price_id: ajax_price_id, vendor_id: VENDOR_ID, company_id: COMPANY_ID)
                end
              end
            end
          end
        end
      end
    end
分享到:
评论

相关推荐

    ruby mechanize安装需要的gem包

    Ruby Mechanize 是一个非常...总之,Ruby Mechanize 是一个强大且功能丰富的库,用于 web 自动化和爬虫。正确安装其依赖的 gem 包是使用它的前提,而理解如何管理 Gem 和处理潜在问题对于顺利使用 Mechanize 至关重要。

    Ruby-Mechanize一个让自动化web交互变得容易的ruby库

    Ruby-Mechanize是一个强大的...总之,Ruby-Mechanize是一个强大而灵活的工具,它极大地简化了Web自动化和爬虫开发的过程。无论是处理简单的页面导航还是执行复杂的交互任务,Mechanize都能帮助开发者高效地完成工作。

    不同语言实现的爬虫程序和爬虫框架.zip

    4. Ruby:Ruby社区有Nokogiri库,用于解析HTML和XML文档,而Mechanize则是一个用于自动化Web浏览的库,常用于爬虫开发。 5. Go:Go语言的Golang-Crawler提供了基础的爬虫结构,适合构建高效、并发的爬虫系统。 6. ...

    ruby写的网络蜘蛛

    Ruby拥有丰富的库和框架,如Nokogiri、Mechanize和Capybara等,它们极大地简化了网络爬虫的开发过程。 1. Nokogiri:Nokogiri是一个强大的XML和HTML解析库,它允许开发者解析、搜索和修改文档结构。在Ruby网络爬虫...

    spidey-web-crawlers:Ruby 中的网络爬虫

    在Web爬虫领域,Ruby有多个强大的库,如Nokogiri、HTTParty和Mechanize等,使得构建爬虫变得相对简单。Nokogiri用于解析HTML和XML文档,HTTParty则方便地处理HTTP请求,Mechanize则可以模拟浏览器行为,处理表单提交...

    Ruby中使用mechanize批量下载校内网相册照片

    总结来说,这段代码展示了如何使用Ruby和Mechanize库来自动化登录网站、解析网页、提取数据以及下载资源,这对于需要类似功能的场景非常有用,比如爬虫或自动化数据抓取任务。同时,它也提醒我们在处理不同网站时...

    web-scrapping-mechanize-firstmeetup:阿方索·曼西拉 (Alfonso Mancilla) 在第一次 ruby​​ 聚会中使用机械化进行网页抓取的示例

    在本示例中,"web-scrapping-mechanize-firstmeetup" 是一个项目,由阿方索·曼西拉(Alfonso Mancilla)在一次 Ruby 聚会上介绍,展示了如何利用 Ruby 的机械化(Mechanize)库来实现这一过程。机械化是一个强大的...

    jd_crawler:jd爬虫

    `jd_crawler` 是一款基于 Ruby 语言编写的爬虫程序,专门用于抓取京东网站上的商品信息。在互联网数据挖掘和分析领域,爬虫是获取大量网页数据的重要工具,`jd_crawler` 的设计和实现揭示了如何有效地从特定目标网站...

    为什么说python适合写爬虫

    此外,抓取网页有时候需要模拟浏览器的行为,很多网站对于生硬的爬虫抓取都是封杀的。这是我们需要模拟user agent的行为构造合适的请求,譬如模拟用户登陆、模拟session/cookie的存储和设置。在python里都有非常优秀...

    ruby-scraping:一堆为@LeWagon 学生抓取的 ruby​​ 脚本

    8. **库的使用**:除了Nokogiri,还有其他辅助库如Mechanize(处理表单提交和cookies)和Capybara(模拟用户交互)可以帮助构建更复杂的爬虫。 9. **实践项目**:实际编写脚本抓取真实网站是学习过程的关键部分,它...

    oireachtasdata:从oireachtasdebates.oireachtas.ie中提取的结构化数据

    这个项目利用了编程语言 Ruby,因此我们可以推断它可能使用了 Ruby 的网络爬虫技术和数据处理库来实现这一目标。 首先,我们需要理解 "Oireachtas" 这个词。在爱尔兰语中,它代表爱尔兰议会,是爱尔兰的立法机构,...

    THP0305_google_searcher

    【THP0305_google_searcher】是一个基于Ruby编程语言开发的工具,主要用于执行Google搜索引擎的查询。这个工具可能被用作数据抓取、网络爬虫或是进行SEO(搜索引擎优化)分析。Ruby以其简洁、易读的语法而受到开发者...

    geelong_scraper

    【标题】"geelong_scraper" 是一个基于Ruby语言开发的程序,主要用于从吉朗市议会的网站上抓取和收集规划申请相关的数据。这个工具可能是为了帮助数据分析、城市规划研究或者公众信息获取等目的而设计的。 【描述】...

    web-scraping

    以下是基于Ruby的Web Scraping的一些核心知识点: 1. **HTTP基础**:了解HTTP协议是必要的,因为Web Scraping涉及到向服务器发送请求并接收响应。理解GET和POST请求的区别,以及如何处理HTTP头和状态码。 2. **...

    idealista-cartodb

    Ruby 有多种库可以支持这个过程,例如 Nokogiri 和 Mechanize,它们能够解析 HTML 和执行页面上的 JavaScript。 接下来是 CartoDB。CartoDB 提供了一个用户友好的界面,让非技术人员也能创建和管理地理空间数据。它...

Global site tag (gtag.js) - Google Analytics