java jsoup 网络爬虫 学习例子(七)京东和淘宝商品比价 htmlunit

 

java jsoup 网络爬虫 学习例子(七)京东和淘宝商品比价 htmlunit

 



          

 

package com.iteye.injavawetrust.pricecheck;

import java.util.List;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public interface ProductList {
	
	/**
	 * 爬取商品列表
	 * @return
	 */
	public List<ProductInfo> getProductList();

}


package com.iteye.injavawetrust.pricecheck;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class JDProductList implements ProductList{
	
private String jdUrl;
	
	private String productName;
	
	private static PriceCheckUtil pcu = PriceCheckUtil.getInstance();
	
	public JDProductList(String jdUrl, String productName){
		this.jdUrl = jdUrl;
		this.productName = productName;
	}

	@Override
	public List<ProductInfo> getProductList() {
		List<ProductInfo> jdProductList = new ArrayList<ProductInfo>();
		ProductInfo productInfo = null;
		String url = "";
		for(int i = 0; i < 10; i++){
			try {
				System.out.println("JD Product 第[" + (i + 1) + "]页");
				if(i == 0) {
					url = jdUrl;
				}else{
					url = Constants.JDURL + pcu.getGbk(productName) + Constants.JDENC + Constants.JDPAGE + (i + 1);
				}
				System.out.println(url);
				Document document = Jsoup.connect(url).timeout(5000).get();
				Elements uls = document.select("ul[class=gl-warp clearfix]");
				Iterator<Element> ulIter = uls.iterator();
				while(ulIter.hasNext()) {
					Element ul = ulIter.next();
					Elements lis = ul.select("li[data-sku]");
					Iterator<Element> liIter = lis.iterator();
					while(liIter.hasNext()) {
						Element li = liIter.next();
						Element div = li.select("div[class=gl-i-wrap]").first();
						Elements title = div.select("div[class=p-name p-name-type-2]>a");
						String productName = title.attr("title"); //得到商品名称
						Elements price = div.select(".p-price>strong");
						String productPrice =price.attr("data-price"); //得到商品价格
						productInfo = new ProductInfo();
						productInfo.setProductName(productName);
						productInfo.setProductPrice(productPrice);
						jdProductList.add(productInfo);
					}
				}
			} catch(Exception e) {
				System.out.println("Get JD product has error [" + url + "]");
				System.out.println(e.getMessage());
			}
		}
		return jdProductList;
	}
	
	public static void main(String[] args) {
		try {
			String productName = "书包";
			String jdUrl = Constants.JDURL + pcu.getGbk(productName)  + Constants.JDENC;
			List<ProductInfo> list = new JDProductList(jdUrl, productName).getProductList();
			System.out.println(list.size());
			for(ProductInfo pi : list){
				System.out.println(pi.getProductName() + "  " + pi.getProductPrice());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


package com.iteye.injavawetrust.pricecheck;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class TBProductList implements ProductList{
	
	private static PriceCheckUtil pcu = PriceCheckUtil.getInstance();
	
	private String tbUrl;
	
	private String productName;
	
	public TBProductList(String tbUrl, String productName) {
		this.tbUrl = tbUrl;
		this.productName = productName;
	}

	@Override
	public List<ProductInfo> getProductList() {
		List<ProductInfo> tbProductList = new ArrayList<ProductInfo>();
		ProductInfo productInfo = null;
		String url = "";
		int page = 0;
		for(int i = 0; i < 10; i++){
			try {
				System.out.println("TB Product 第[" + (i + 1) + "]页");
				if(i == 0){
					url = tbUrl;
				}else{
					page += 44;
					url = Constants.TBURL + pcu.getUrlCode(productName) + Constants.TBPAGE + page;
				}
				System.out.println(url);
				Document doc = Jsoup.parse(pcu.getXmlByHtmlunit(url));
				Elements itemlist = doc.select("div[class=m-itemlist]");
				Iterator<Element> it = itemlist.iterator();
				while(it.hasNext()){
					Element item = it.next();
					Elements items = item.select("div[data-category=auctions]");
					System.out.println(items.size());
					Iterator<Element> one = items.iterator();
					while(one.hasNext()){
						Element e = one.next();
						Elements price = e.select("div[class=price g_price g_price-highlight]>strong");
						String productPrice = price.text();
						Elements title = e.select("div[class=row row-2 title]>a");
						String productName = title.text();
						productInfo = new ProductInfo();
						productInfo.setProductName(productName);
						productInfo.setProductPrice(productPrice);
						tbProductList.add(productInfo);
					}
					
				}
			} catch(Exception e) {
				System.out.println("Get TB product has error");
				System.out.println(e.getMessage());
			}
		}
		
		
		return tbProductList;
	}
	
	public static void main(String[] args) {		
		try{
			String productName = "铅笔";
			String tbUrl = Constants.TBURL + pcu.getUrlCode(productName);
			List<ProductInfo> list = new TBProductList(tbUrl, productName).getProductList();
			for(ProductInfo pi : list){
				System.out.println("[" + pi.getProductName() + "]  [" + pi.getProductPrice() + "]");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}


package com.iteye.injavawetrust.pricecheck;

import java.io.Serializable;
import java.util.Date;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class ProductInfo implements Serializable{

	private static final long serialVersionUID = 8179244535272774089L;
	
	/**
	 * 商品ID
	 */
	private String productid;
	/**
	 * 商品名称
	 */
	private String productName;
	/**
	 * 商品价格
	 */
	private String productPrice;
	/**
	 * 月销售笔数
	 */
	private String tradeNum;
	/**
	 * 商品URL
	 */
	private String productUrl;
	/**
	 * 商品网店名称
	 */
	private String shopName;
	/**
	 * 电商名称
	 */
	private String ecName;
	/**
	 * 爬取入库日期
	 */
	private Date date;
	
	public String getProductid() {
		return productid;
	}
	public void setProductid(String productid) {
		this.productid = productid;
	}
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		this.productName = productName;
	}
	public String getProductPrice() {
		return productPrice;
	}
	public void setProductPrice(String productPrice) {
		this.productPrice = productPrice;
	}
	public String getTradeNum() {
		return tradeNum;
	}
	public void setTradeNum(String tradeNum) {
		this.tradeNum = tradeNum;
	}
	public String getProductUrl() {
		return productUrl;
	}
	public void setProductUrl(String productUrl) {
		this.productUrl = productUrl;
	}
	public String getShopName() {
		return shopName;
	}
	public void setShopName(String shopName) {
		this.shopName = shopName;
	}
	public String getEcName() {
		return ecName;
	}
	public void setEcName(String ecName) {
		this.ecName = ecName;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	
}


package com.iteye.injavawetrust.pricecheck;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class Constants {
	
	/**
	 * JDURL
	 */
	public static String JDURL = "http://search.jd.com/Search?keyword=";
	/**
	 * JD汉字编码格式
	 */
	public static String JDENC = "&enc=utf-8";
	/**
	 * JD分页
	 */
	public static String JDPAGE ="&page=";
	/**
	 * TBURL
	 */
	public static String TBURL = "https://s.taobao.com/search?q=";
	/**
	 * 淘宝分页
	 */
	public static String TBPAGE = "&s=";
	/**
	 * 超时时间
	 */
	public static int TIMEOUT = 50000;

}


package com.iteye.injavawetrust.pricecheck;

import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.TimeZone;

import org.apache.commons.logging.LogFactory;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.HttpMethod;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class PriceCheckUtil {
	
	private PriceCheckUtil() {
		
	}
	
	private static final PriceCheckUtil instance = new PriceCheckUtil();
	
	public static PriceCheckUtil getInstance() {
		return instance;
	}
	
	
	/**
	 * 商品汉字转码
	 * @param productName 商品名称
	 * @return
	 */
	public String getGbk(String productName){
		String retGbk = "";
		try {
			retGbk = new String(productName.getBytes("UTF-8"), "GBK");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return retGbk;
	}
	/**
	 * 对淘宝浏览器汉字进行转换
	 * @param productName 商品名称
	 * @return
	 */
	public String getUrlCode(String productName){
		String retUrlCode = "";
		try {
			retUrlCode = URLEncoder.encode(productName, "utf8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return retUrlCode;
	}
	
	/**
     * 从列表list中找到与productName相似度最高的ProductInfo
     *
     * @param productName
     * @param list
     * @return 相似度最高的productName
     */
	public ProductInfo getSimilarity(String productName, List<ProductInfo> list) {
		ProductInfo productInfo = null;
		/**
		 * 找到list中所有的productName与字符串productName的相似度,保存在lens数组中
		 */
		double lens[] = new double[list.size()];
		for (int i = 0; i < list.size() - 1; i++) {
			lens[i] = sim(productName, list.get(i).getProductName());
		}
		/**
		 * 遍历出最大的相似度maxLen
		 */
		double maxLen = 0.0;
		for (int i = 0; i < lens.length; i++) {
			if (maxLen < lens[i]) {
				maxLen = lens[i];
			}
		}
		/**
		 * 遍历出最大的相似度的索引maxLenIndex
		 */
		int maxLenIndex = 0;
		for (int i = 0; i < lens.length; i++) {
			if (maxLen == lens[i]) {
				maxLenIndex = i;
			}
		}
		productInfo = list.get(maxLenIndex);
		return productInfo;
	}
	
	/**
     * 求三个数中最小的一个
     * @param one
     * @param two
     * @param three
     * @return
     */
    public int min(int one, int two, int three) {
        int min = one;
        if(two < min) {
            min = two;
        }
        if(three < min) {
            min = three;
        }
        return min;
    }

    /**
     * 计算矢量距离
     * Levenshtein Distance(LD)
     * @param str1
     * @param str2
     * @return
     */
    public int ld(String str1, String str2) {
        int d[][];    //矩阵
        int n = str1.length();
        int m = str2.length();
        int i;    //遍历str1的
        int j;    //遍历str2的
        char ch1;    //str1的
        char ch2;    //str2的
        int temp;    //记录相同字符,在某个矩阵位置值的增量,不是0就是1
        if(n == 0) {
            return m;
        }
        if(m == 0) {
            return n;
        }
        d = new int[n+1][m+1];
        for(i=0; i<=n; i++) {    //初始化第一列
            d[i][0] = i;
        }
        for(j=0; j<=m; j++) {    //初始化第一行
            d[0][j] = j;
        }
        for(i=1; i<=n; i++) {    //遍历str1
            ch1 = str1.charAt(i-1);
            //去匹配str2
            for(j=1; j<=m; j++) {
                ch2 = str2.charAt(j-1);
                if(ch1 == ch2) {
                    temp = 0;
                } else {
                    temp = 1;
                }
                //左边+1,上边+1, 左上角+temp取最小
                d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+temp);
            }
        }
        return d[n][m];
    }

    /**
     * 计算相似度
     * @param str1
     * @param str2
     * @return
     */
	public double sim(String str1, String str2) {
		int ld = ld(str1, str2);
		return 1 - (double) ld / Math.max(str1.length(), str2.length());
	}
	
	/** 
     * 毫秒转换成hhmmss 
     * @param ms 毫秒 
     * @return hh:mm:ss 
     */  
    public String msToss(long ms) {
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");  
        formatter.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));  
        String ss = formatter.format(ms);  
        return ss;  
    }
    
    /**
	 * 禁止htmlunit日志输出
	 */
	public void offLog(){
		LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
				"org.apache.commons.logging.impl.NoOpLog");
	}
	/**
	 * 获取淘宝数据
	 * @param url
	 * @return
	 * @throws Exception
	 */
	public String getXmlByHtmlunit(String url) throws Exception {
		offLog();
		String ret = "";
		WebClient webClient = new WebClient(BrowserVersion.CHROME);
		// 1 启动JS
		webClient.getOptions().setJavaScriptEnabled(true);
		// 2 禁用Css,可避免自动二次请求CSS进行渲染
		webClient.getOptions().setCssEnabled(false);
		// 3 启动客户端重定向
		webClient.getOptions().setRedirectEnabled(true);
		// 4 JS运行错误时,是否抛出异常
		webClient.getOptions().setThrowExceptionOnScriptError(false);
		// 5AJAX support
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
		// 6 设置超时
		webClient.getOptions().setTimeout(Constants.TIMEOUT);
		WebRequest webRequest = new WebRequest(new URL(url));
		webRequest.setHttpMethod(HttpMethod.GET);
		HtmlPage page = webClient.getPage(webRequest);
		webClient.waitForBackgroundJavaScript(10000);
		ret = page.asXml();
		webClient.close();
		return ret;
	}

}


package com.iteye.injavawetrust.pricecheck;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class PriceCheckMain {
	
	private static PriceCheckUtil pcu = PriceCheckUtil.getInstance();
	
	public List<Map<String, ProductInfo>> getProductList(String productName) {
		
		String jdUrl = Constants.JDURL + productName + Constants.JDENC;
		
		String tbUrl = Constants.TBURL + productName;
		
		return getProductFromUrls(jdUrl, tbUrl, productName);
	}
	
	public List<Map<String, ProductInfo>> getProductFromUrls(String jdUrl, String tbUrl, String productName) {
		List<Map<String, ProductInfo>> retListMap = new ArrayList<Map<String,ProductInfo>>();
		List<ProductInfo> jdProductList = new JDProductList(jdUrl, productName).getProductList();
		List<ProductInfo> tbProductList = new TBProductList(tbUrl, productName).getProductList();
		for(int i = 0; i < jdProductList.size(); i++){
			String jdProductName = jdProductList.get(i).getProductName();
			Map<String, ProductInfo> map = new HashMap<String, ProductInfo>();
			map.put("JD", jdProductList.get(i));
			ProductInfo tbProduct = pcu.getSimilarity(jdProductName, tbProductList);
			map.put("TB", tbProduct);
			retListMap.add(map);
		}
		
		return retListMap;
	}
	
	
	public static void main(String[] args) {
		System.out.println("输入商品名称:");
		Scanner scanner = new Scanner(System.in);
		String productName = scanner.next();
		scanner.close();
		System.out.println("京东和淘宝[" + productName + "]商品比价开始。。。。。。");
		try{
			long starTime = System.currentTimeMillis();
			List<Map<String, ProductInfo>> list = new PriceCheckMain().getProductList(productName);
			for(Map<String, ProductInfo> map : list){
				String jdName = map.get("JD").getProductName();
				String jdPrice = map.get("JD").getProductPrice();
				String ddName = map.get("TB").getProductName();
				String ddPrice = map.get("TB").getProductPrice();
				
				System.out.println("[" + jdName + "]  [" + ddName + "]");
				System.out.println("[" + jdPrice + "]  [" + ddPrice + "]");
				System.out.println("-----------------------------------------------------------");
			}
			long endTime = System.currentTimeMillis();
			System.out.println("用时 [" + pcu.msToss(endTime - starTime) + "]");
		}catch(Exception e){
			System.out.println("error");
			System.out.println(e.getMessage());
		}
	}

}


 

 

运行结果:

 

输入商品名称:
铅笔
京东和淘宝[铅笔]商品比价开始。。。。。。
JD Product 第[1]页
http://search.jd.com/Search?keyword=铅笔&enc=utf-8
JD Product 第[2]页
http://search.jd.com/Search?keyword=閾呯瑪&enc=utf-8&page=2

。。。。。。。。。。。。。。。。。。。

TB Product 第[1]页
https://s.taobao.com/search?q=铅笔
RHINO USAGE WARNING: Missed Context.javaToJS() conversion:
Rhino runtime detected object com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot read property "domainLookupEnd" from undefined (https://g.alicdn.com/??kissy/k/1.4.15/import-style-min.js,tb/tracker/1.0.19/index.js,/tb/tsrp/1.61.0/config.js#9) of class com.gargoylesoftware.htmlunit.ScriptException where it expected String, Number, Boolean or Scriptable instance. Please check your code for missing Context.javaToJS() call.
46
TB Product 第[2]页
https://s.taobao.com/search?q=%E9%93%85%E7%AC%94&s=44
RHINO USAGE WARNING: Missed Context.javaToJS() conversion:
Rhino runtime detected object com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot read property "domainLookupEnd" from undefined (https://g.alicdn.com/??kissy/k/1.4.15/import-style-min.js,tb/tracker/1.0.19/index.js,/tb/tsrp/1.61.0/config.js#9) of class com.gargoylesoftware.htmlunit.ScriptException where it expected String, Number, Boolean or Scriptable instance. Please check your code for missing Context.javaToJS() call.

。。。。。。。。。。。。。。。。

-----------------------------------------------------------
[施德楼(Staedtler)100 蓝杆画图绘图铅笔|素描铅笔 HB单支装]  [原装进口德国Staedtler施德楼 铅笔 100蓝杆绘图 顶级绘画素描 铅笔]
[4.80]  [3.60]
-----------------------------------------------------------
[施德楼(Staedtler) 铅芯|自动铅笔芯|替芯 250-12根/支0.9mm HB]  [原装进口德国Staedtler施德楼 铅笔 100蓝杆绘图 顶级绘画素描 铅笔]
[12.00]  [3.60]
-----------------------------------------------------------
用时 [00:02:40]

 

Seurat 单细胞转录组测序数据分析教程(三)——python(scanpy) 文章参考至,做了一个更详细的解读。本教程探讨了 scanpy 的可视化可能性,分为三个部分:嵌入的散点图(例如 UMAP、t-SNE)使用已知标记基因鉴定簇差异表达基因的可视化在本教程中,我们将使用来自 10x 的数据集,其中包含来自PBMC的 68k 个细胞。Scanpy 在其分布中包括该数据集的简化样本,该数据集仅包含 700 个细胞和 765 个高度可变的基因。该数据集已经过预处理和 UMAP 计算。在本教程中,我们还将使用以下文献标记:B细胞:CD79A、MS4A1。 阅读详情

相关推荐

ANSYS Workbench接触分析实战:从算法选择到收敛难题破解

本文深入解析ANSYS Workbench接触分析的核心技术与实战技巧,涵盖四大接触算法选择、收敛难题破解秘籍及典型场景参数设置。通过实际案例演示如何优化接触刚度、pinball区域和非对称行为等关键参数,帮助工程师有效解决结构非线性问题,提升仿真效率和精度。

weixin_28705087的博客 361

JAVA爬取淘宝、京东、天猫以及苏宁商品详细数据(一)

JAVA爬取某东、某宝以及某宁商品详细数据(一)写在最前反爬策略问题解决请求头配置无代理模式代理模式某东JDHTML解析JD商品解析天猫TMHTML解析苏宁SNHTML解析 写在最前      防止篇幅过长,对于如何爬取某东、某宝以及某宁的历史价格数据,会在下一篇博客中进行总结:https://blog.youkuaiyun.com/qq_40921561/article/details/110950930 反爬策略问题解决     某东、某宝以及某宁电商网站平台,对于爬虫还算比较友好,唯一的问题就是有些数据是动态加载

入门程序猿的博客 4876

虚拟零售智能客服架构设计:如何用大模型实现多轮对话与精准推荐?

想象一下,当你在一个电商平台购物时,遇到了一个能像你的专属导购一样,不仅能听懂你模糊的需求(“我想买一件适合夏天去海边玩,又能兼顾日常通勤的裙子”),还能记得你之前提到的尺码偏好和预算,甚至在你犹豫时,主动推荐几款符合你风格且正好有促销活动的商品——这不再是科幻电影中的场景,而是基于大语言模型(LLM)技术的新一代虚拟零售智能客服能够提供的体验。这一层是我们架构设计的重点,会在后续章节详细展开。如基于CRF、RNN的模型,或基于规则的状态更新,通常需要大量标注的对话状态数据,且对新领域、新槽位的适应性差。

Java大师兄的博客 1590

Java网络爬虫——jsoup快速上手,爬取京东数据。同时解决‘京东安全’防爬问题

java爬虫,爬取京东商品内容。同时解决登录界面跳转问题

qq_62835094的博客 9376

无痛安装及初始配置 PHP 8.0.3 + Apache 2.4 + MySQL 8.0

PHP 8.0.3 + Apache 2.4 + MySQL 8.0MySQL 8.0.23 安装下载安装配置环境变量初始化MySQLPHP8.0.3 安装下载安装配置环境变量Apache 2.4 安装下载安装启动 MySQL 8.0.23 安装 下载 到官方网站下载:https://dev.mysql.com/downloads/mysql/ 目前的最新版本是MySQL 8.0.23 在Windows上有两种安装方式,一个是zip压缩文件解压然后配置,另一个是图像化界面安装。 这里选择第一种方法安装:

Kuang Da's Blog 6208

【ArcGIS Add-in编程】如何创建ArcMap的下拉菜单插件

step1. VS2010中创建一个空的解决方案step2.创建一个项目 直接点击finish。step3 为该项目创建项目,选择Menu,作为根菜单,而后修改xml中的items项,添加需要放在下拉菜单中的项目,例如一个按钮; step4 现在可以创建项目,作为菜单中的项目。为该项目添加新的项目,选择button 此时 xml文件中,多了该button的项目,将该项目添加到items

吃货小跟班的博客 4431

Java 爬虫爬取京东、天猫、淘宝商品数据工具类

目的: 利用Java实现爬取淘宝、京东、天猫某商品信息。 导入jsoup包 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据,我本人使用的是1.11.3版本。 当前版本的jsoup API文档:https://tool.oschina.net/apidocs/apidoc?api=jsoup-1.6.3 <dependency> <groupId&g

qq_42014514的博客 3884

反应堆设计:基于MATLAB的反应堆仿真和分析,包括反应堆稳态分析、反应堆动态分析和反应堆安全分析 介绍

反应堆设计是利用计算机技术对核反应堆进行设计和模拟,以获得安全、高效、经济的核能发电系统。它是核能领域的重要组成部分,在电力生产、核医学、科学研究等领域有着广泛的应用。

走向CTO的路上... 1113

java jsoup 网络爬虫 学习例子(八)京东和淘宝商品比价 PhantomJS

java jsoup 网络爬虫 学习例子(八)京东和淘宝商品比价 PhantomJS /* * filename getHtml.js * phantomjs.exe 2.0.0 * author InJavaWeTrust */ var system = require('system'); var address = ''; if (system.args....

14万+

ESP32开发板使用Arduino实现变成蓝牙鼠标教程

通过这个教程,你可以轻松将ESP32开发板变成蓝牙鼠标。如果你在使用过程中遇到任何问题,或者库没有正常工作,不妨下载我上传的修复版本,再试试看。希望你们能根据这个基础做出更多有趣的蓝牙控制项目!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 971

蓝桥杯 stm32 PWM 测量频率

参考 数据手册:比赛 的板子 上面有两个信号发生器,如下图。通过 扭动 可变电阻 (R40, R39), 来实现 PWM 频率的改变。PA15PB4。PA15,PB4分别使用TIM2_CH1TIM3_CH1来对频率进行捕获。

wuyiyu_的博客 2931

java jsoup 网络爬虫 jsoup解析html Java爬虫 Jsoup爬虫 jsoup例子

java jsoup 网络爬虫 java jsoup 网络爬虫 学习例子(一)抓取豆瓣电影名称+推荐星级 java jsoup 网络爬虫 学习例子(二)只抓取豆瓣电影5星(力荐)电影名称 java jsoup 网络爬虫 学习例子(三)抓取豆瓣电影海报图片 下载到本地 java jsoup 网络爬虫 学习例子(四)抓取网页连接插入mysql数据库 java ...

18万+

3.详解Labview串口通讯--从串口线连接到串口通讯保姆级教程

本文非常详细的介绍了使用Labview实现串口通讯,读完题主这篇文章,即使你是今天刚下载的Labview,也能熟练的连接并驱动串口执行,接下来和我一起学习下,记得关注并点赞不迷路

关注我,更多技术问题欢迎私聊~ 1万+

Jsoup 网络爬虫 学习例子

发现一个很好的jsoup的学习博客,整理如下: 作者地址:http://injavawetrust.iteye.com/java jsoup 网络爬虫 学习例子(一) 抓取豆瓣电影名称+推荐星级 java jsoup 网络爬虫 学习例子(二) 只抓取豆瓣电影5星(力荐)电影名称 java jsoup 网络爬虫 学习例子(三)抓取豆瓣电影海报图片 下载到本地 java jsoup 网络爬虫 学

我家有个艳的博客 845

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【java】学习---爬虫

------------jsoup提取连接下载网站图片java jsoup 网络爬虫 学习例子(七)京东和淘宝商品比价 htmlunit http://blog.youkuaiyun.com/woshishui6501/article/details/8465364------------比价-----------------------------------------------------http://injavawetrust.iteye.com/category/353919 ------------动

ncutlh的专栏 267

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java爬虫项目(一)利用Jsoup爬虫爬取天猫商品信息

前言  这是我第一次用Java来写爬虫项目,研究的也不是很透彻,所以爬虫技术的理论方面的就不说太多了。 主要还是以如何爬取商品信息为主,爬取最简单的商品信息,给出大概的思路和方法。 对于没有反爬技术的网站,爬取商品信息最简单。我测试了京东、淘宝、天猫这些大型购物网站,发现只有天猫商城是没有做任何反爬处理的,所以就从最简单的爬取天猫商品信息开始写。 思路方法 1、对于没有反爬技术的网站思路最...

耗子的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

使用java实现爬取淘宝商品页面数据

import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class taobao { public static void main(String[] args) { try { String url = "https://s.taobao.com/search?q=%E9%A5%B

zhouyingxiong的博客 1万+

Java多线程爬虫爬取京东商品信息

前言网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫可以通过模拟浏览器访问网页,从而获取数据,一般网页里会有很多个URL,爬虫可以访问这些URL到达其他网页,相当于形成了一种数据结构——图,我们通过广度优先搜索和深度优先搜索的方式来遍历这个图,从而做到不断爬取数据的目的。最近准备做一个电商网站,商品的原型就打算从一些电商网站上爬取,这里使用了HttpClient和Jsoup实

zgj12138的博客 7785

Java爬虫爬取京东商城

一、任务: 旨在通过使用java爬虫,提取网络中的各种商品信息,并收集的商品信息建立统一数据模型存储数据,通过数据模型描述商品的基本属性。如spu,sku,商品描述,价格等信息,同时需要剔除非必要信息,做到精准分析。根据所获取的信息提供商品展示页面,通过搜索,得到商品数据信息。抓取商品数据,建立统一数据模型,模型的可扩展性,商品数据展示。 目的:该项目有利于简单理解java的爬虫过程,spring boot简单的项目调试,调用,映射方式,数据库连接,帮助理解的前后端交互原理。 二、类及数据的设计 2

weixin_50005436的博客 5113

java.lang.common包冲突。

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:56086,suspend=y,server=n -javaagent:/Users/diliang/Library/Caches/Intell...

一杯派蒙的博客 661

java rhino 运行 js_使用Rhino让java执行javascript的方法实例

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView text1 = (Tex...

weixin_26913055的博客 656

java rhino 运行 js_深入浅出Rhino:Java与JS互操作

输出中列出三个重载方法。第一个为无参函数,第二与第三个对应的参数分别为FilenameFilter与FileFilter。另一个比较有意思的特点是通过构造for..in,查看对象对应的所有方法与变量。如下:js>for(iinf){print(i)}existsparentFilemkdirtoStringwait[44others]这里列出的方法一部分来自于父类,比如wait...

weixin_30407555的博客 777

网购平台比价系统的实现--UI设计代码

网购平台比价系统

qq_60207741的博客 1306

htmlunit使用实例

由于第一次使用爬虫爬取网页内容,遇到一些特殊的情况也不是太会处理,这里把我遇到的一些情况和大家分享一下。 public static String getPage(String s_url, String charset) { if (s_url == null) { return null; } try { URL url = new URL(s_url); Buffered

zhourenfei17的专栏 1701
上一篇: java jsoup 网络爬虫 学习例子(六)京东和当当商品比价
下一篇: java jsoup 网络爬虫 学习例子(八)京东和淘宝商品比价 PhantomJS
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值