很多企业要求利用爬虫去爬取商品信息,一般的开发模型如下:

for i=1;i<=最大页号;i++

列表页面url=商品列表页面url+?page=i(页号)

列表页面=爬取(列表页面url)

商品链接列表=抽取商品链接(列表页面)

for 链接 in 商品链接列表:

商品页面=爬取(链接)

抽取(商品页面);

这样的模型看似简单,但是有一下几个问题:

1)爬虫没有线程池支持。

2)没有断点机制。

3)没有爬取状态存储,爬取商品网站经常会出现服务器拒绝链接(反问次数过多),导致一旦出现

拒绝链接,有部分页面是未爬取状态。而没有爬取状态记录,导致爬虫需要重新爬取,才可获得完整数据。

4)当抽取业务复杂时,代码可读性差(没有固定框架)

很多企业解决上面问题时,并没有选择nutch、crawler4j这样的爬虫框架,因为这些爬虫都是基于广度遍历的,上面的业务虽然是简单的双重循环,但是不是广度遍历。但是实际上这个双重循环,是可以转换成广度遍历的,当广度遍历的的层数为1的时候,等价于基于url列表的爬取(种子列表)。上面业务中的循环,其实就是基于url列表的爬取。上面的伪代码是双重循环,所以可以拆分成2次广度遍历来完成的。

我们设计两个广度遍历器LinkCrawler和ProductCrawler:

1)LinkCrawler负责遍历商品列表页面,抽取每个商品详情页面的url,将抽取出的url注入(inject)到ProductCrawler里

2)ProductCrawler以LinkCrawler注入的url为种子,进行爬取,对每个商品详情页面进行抽取。

这里以WebCollector爬虫框架为例,给出一段爬取大众点评团购的示例:

import java.io.File;

import java.io.IOException;

import java.util.regex.Pattern;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import cn.edu.hfut.dmic.webcollector.crawler.BreadthCrawler;

import cn.edu.hfut.dmic.webcollector.generator.Injector;

import cn.edu.hfut.dmic.webcollector.model.Page;

import cn.edu.hfut.dmic.webcollector.util.Config;

import cn.edu.hfut.dmic.webcollector.util.FileUtils;

/**

* 爬取大众点评团购信息的爬虫Demo 很多精抽取的爬虫,并不是采用简单的广度遍历算法,而是采用两个步骤完成:

* 1.用循环遍历商品列表页面,抽取每个商品详情页面的url 2.对每个商品详情页面进行抽取

* 大多数爬虫往往只支持广度遍历,所以很多人选择自已用循环来进行上面的抽取 操作,这样做往往不能享受到爬虫框架所提供的线程池、异常处理和断点支持等 功能。

*

* 其实上面的抽取任务,是可以通过拆分成2次广度遍历来完成的。 当广度遍历的的层数为1的时候,等价于基于url列表的爬取(种子列表)

* 我们设计两个广度遍历器LinkCrawler和ProductCrawler

* 1)LinkCrawler负责遍历商品列表页面,抽取每个商品详情页面的url,将抽取出的url注 入(inject)到ProductCrawler里

* 2)ProductCrawler以LinkCrawler注入的url为种子,进行爬取,对每个商品详情页面进行 抽取。

*

* @author hu

*/

public class DazhongDemo {

public static class LinkCrawler extends BreadthCrawler {

Injector injector;

public LinkCrawler(String linkPath, String productPath) {

setCrawlPath(linkPath);

/*向ProductCrawler爬虫注入种子的注入器*/

injector = new Injector(productPath);

/*LinkCrawler负责遍历商品列表页面,i是页号*/

for (int i = 1; i < 3; i++) {

addSeed("http://t.dianping.com/list/hefei-category_1?pageno=" + i);

}

addRegex(".*");

}

@Override

public void visit(Page page) {

Document doc = page.getDoc();

Elements links = doc.select("li[class^=floor]>a[track]");

for (Element link : links) {

/*href是从商品列表页面中抽取出的商品详情页面url*/

String href = link.attr("abs:href");

System.out.println(href);

synchronized (injector) {

try {

/*将商品详情页面的url注入到ProductCrawler作为种子*/

injector.inject(href, true);

} catch (IOException ex) {

}

}

}

}

/*Config.topN=0的情况下,深度为1的广度遍历,等价于对种子列表的遍历*/

public void start() throws IOException {

start(1);

}

}

public static class ProductCrawler extends BreadthCrawler {

public ProductCrawler(String productPath) {

setCrawlPath(productPath);

addRegex(".*");

setResumable(true);

setThreads(5);

}

@Override

public void visit(Page page) {

/*判断网页是否是商品详情页面,这个程序里可以省略*/

if (!Pattern.matches("http://t.dianping.com/deal/[0-9]+", page.getUrl())) {

return;

}

Document doc = page.getDoc();

String name = doc.select("h1.title").first().text();

String price = doc.select("span.price-display").first().text();

String origin_price = doc.select("span.price-original").first().text();

String validateDate = doc.select("div.validate-date").first().text();

System.out.println(name + " " + price + "/" + origin_price + validateDate);

}

/*Config.topN=0的情况下,深度为1的广度遍历,等价于对种子列表的遍历*/

public void start() throws IOException {

start(1);

}

}

public static void main(String[] args) throws IOException {

/*

Config.topN表示爬虫做链接分析时,链接数量上限,由于本程序只要求遍历

种子url列表,不需根据链接继续爬取,所以要设置为0

*/

Config.topN = 0;

/*

每个爬虫的爬取依赖一个文件夹,这个文件夹会对爬取信息进行存储和维护

这里有两个爬虫,所以需要设置两个爬取文件夹

*/

String linkPath = "crawl_link";

String productPath = "crawl_product";

File productDir = new File(productPath);

if (productDir.exists()) {

FileUtils.deleteDir(productDir);

}

LinkCrawler linkCrawler = new LinkCrawler(linkPath, productPath);

linkCrawler.start();

ProductCrawler productCrawler = new ProductCrawler(productPath);

productCrawler.start();

}

}

大众点评 爬虫 java_用JAVA制作一个爬取商品信息的爬虫(爬取大众点评)相关推荐

  1. 运用Java制作一个属于自己的音乐播放软件

    运用Java制作一个属于自己的音乐播放软件 前言 上个寒假小编用python做了一个音乐播放软件(博客链接为:)运用tkinter.爬虫做了一个播放音乐的小程序(动态显示歌词[歌词向上翻滚]),觉得效 ...

  2. 使用Java制作一个简易的远控终端

    使用Java制作一个简易的远控终端 远控终端的本质 1.服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息 2.客户端执行消息内容(即执行服务端 ...

  3. 如何用JAVA制作一个漂亮的表格

    如何用JAVA制作一个漂亮的表格 表格图片: 选中一行时高亮显示,且字体变为红色: 在表格中添加数据: 代码如下: import java.awt.BorderLayout; import java. ...

  4. 怎样用Java制作一个选择题

    怎样用Java制作一个选择题? package Work1;public class TestSelect {public static void main(String[] args) {Quest ...

  5. java制作一个GUI实现字符串的相关操作(合并、比较、检索、清除)

    java制作一个GUI实现字符串的相关操作(合并.比较.检索.清除) 1.使用Box容器 2.字符串比较compareTo() 3.字符串检索indexOf() 4.提示弹窗JOptionPane.s ...

  6. vue+flask制作一个网易严选商品评论爬虫可视化系统

    文章目录 1.数据获取 1.1爬取评论信息 1.2 爬取评论标签 2.数据保存策略 3.数据处理 3.1 基于情感词典进行情感分析,词频统计 4.数据可视化 4.1 TOP积极词汇 4.2 TOP消极 ...

  7. Python爬虫学习笔记(实例:淘宝商品信息定向爬虫)

    淘宝商品信息定向爬虫先贴代码,后看解析: #淘宝商品信息定向爬虫 import requests import re#获得页面 def getHTMLText(url):try:#headers = ...

  8. 中国大学MOOC“淘宝商品信息定向爬虫”实例(2022版)

    目标: 获取淘宝搜索页面的信息 提取其中的商品名称和价格 (一)程序的结构设计: 1:提交商品搜索请求,循环获取页面 2:对于每个页面,提取商品名称和价格信息 3:将信息输出到屏幕上 (二)代码实现: ...

  9. 苏宁易购网址爬虫爬取商品信息及图片

    利用scrapy来爬取苏宁官网上任何商品的信息,主要的信息有商品标题.商品现价.商品原价.商铺名称,以及用scrapy的ImagesPipeline来下载商品图片. 部分主函数代码如下: # -*- ...

最新文章

  1. [综合面试] 计算机面试书籍与求职网站推荐
  2. java 通配符 日期_java – 使用带有通配符支持的SimpleDateFormat解析日期字符串(例如* yyyy * MM * dd * hh * mm * ss)...
  3. 简单易用的倒计时js代码
  4. centos7 geenplum5.x postgis开源版本编译
  5. linux 添加删除用户
  6. linux 卸载软件_Linux学习总结--初学者必看指南
  7. H3C交换机做DHCP
  8. 每日一记—蓝牙模块应用(一)
  9. 在linux上压缩文件,Linux上压缩文件的 5 种方法
  10. 用java计算三角形周长_三角形求周长和面积完整的解决方案
  11. 原生Android开发自学过程(一)
  12. docx文件转pdf,使用aspose words 转pdf,并且解决表格格式错乱
  13. 实现 | 朴素贝叶斯模型算法研究与实例分析
  14. Dynamic Head Unifying Object Detection Heads with Attentions 论文阅读笔记
  15. 透过案例看清API接口的作用——演示1688商品详情接口
  16. wps表格宏被禁用如何解禁_wps的excel中宏被禁用怎么办 - 卡饭网
  17. 找零钱问题刨析(Python代码)
  18. 最全最详细数据结构与算法视频-【附课件和源码】
  19. java 向word中添加excel附件并向excel单元格中加入图片并压缩图片并根据图片动态控制单元格高度宽度
  20. 需要用计算机权限才能删除,您需要计算机管理员提供的权限才能对此文件进行更改,删不掉文件怎么处理...

热门文章

  1. 自定义信笺纸样式的EditText
  2. windows 32位系统中进程最大可用内存空间为3GB
  3. TAQ Twin Emperors
  4. [问题已处理]-ubuntu 报错Directory index full
  5. 亚马逊、速卖通、ebay、wish、Lazada、Shopee是如何自己养国外买家账号测评的?
  6. ygo大师规则5最新服服务器未响应,游戏王大师规则2020版本
  7. 前腾讯员工不堪房价回老家进国企!享受清闲日子,但担心又随之而来
  8. 看深蓝学院多传感器融合课程的笔记
  9. java项目中的classpath到底是什么
  10. 【C#】【xUnit】【Moq】.NET单元测试Mock框架Moq初探!