摘要:網(wǎng)絡(luò)爬蟲是的爬蟲框架,比起直接采用爬取有強(qiáng)大的好處,框架中集成了斷點(diǎn)續(xù)爬去重自定義請求等。例如,底層實(shí)現(xiàn)都類似。先這樣吧,不太會(huì)寫文章,希望大家海涵。
網(wǎng)絡(luò)爬蟲
WebCollector是Java的爬蟲框架,比起直接采用HttpClient、JSoup爬取有強(qiáng)大的好處,框架中集成了斷點(diǎn)續(xù)爬、Url去重、自定義Http請求等。例如Nutch、Heritrix,底層實(shí)現(xiàn)都類似。
下面是倆種爬蟲的實(shí)現(xiàn):
1、Node爬蟲npm下載模塊
var eventproxy = require("./lib/eventproxy"); var ep = new eventproxy(); var superagent = require("superagent"); var cheerio = require("cheerio"); var url = require("url"); var cnodeUrl = "https://cnodejs.org/"; superagent.get(cnodeUrl).end(function(err,res){ if(err) return console.error(err); var topicUrls = []; var $ = cheerio.load(res.text); //獲取首頁所有鏈接 $("#topic_list .topic_title").each(function(idx,element){ var $element = $(element); var href = url.resolve(cnodeUrl,$element.attr("href")); topicUrls.push(href); }); console.log(topicUrls); // 命令 ep 重復(fù)監(jiān)聽 topicUrls.length 次(在這里也就是 40 次) `topic_html` 事件再行動(dòng) ep.after("topic_html", topicUrls.length, function (topics) { // topics 是個(gè)數(shù)組,包含了 40 次 ep.emit("topic_html", pair) 中的那 40 個(gè) pair // 開始行動(dòng) topics = topics.map(function (topicPair) { // 接下來都是 jquery 的用法了 var topicUrl = topicPair[0]; var topicHtml = topicPair[1]; var $ = cheerio.load(topicHtml); return ({ title: $(".topic_full_title").text().trim(), href: topicUrl, comment1: $(".reply_content").eq(0).text().trim(), }); }); console.log("final:"); console.log(topics); }); topicUrls.forEach(function (topicUrl) { superagent.get(topicUrl) .end(function (err, res) { console.log("fetch " + topicUrl + " successful"); ep.emit("topic_html", [topicUrl, res.text]); }); }); }); //異步并發(fā) ep.all("data1","data2",function(data1,data2){ console.log(data1+","+data2); }); superagent.get(cnodeUrl).end(function(err,res){ ep.emit("data1",res.test); }); superagent.get(cnodeUrl).end(function(err,res){ ep.emit("data2",res.test); });2、WebCollector
需要下載的Jar:
WebCollector,解壓后將webcollector-2.32-bin中的jar放入項(xiàng)目中。
selenium(用于解析Html)。
下面是爬取新浪微博的代碼:
import cn.edu.hfut.dmic.webcollector.model.CrawlDatum; import cn.edu.hfut.dmic.webcollector.model.CrawlDatums; import cn.edu.hfut.dmic.webcollector.model.Page; import cn.edu.hfut.dmic.webcollector.net.HttpRequest; import cn.edu.hfut.dmic.webcollector.net.HttpResponse; import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; /** * * 爬取微博 * @author Alex * */ public class WeiboCrawler extends BreadthCrawler { private String cookie; public WeiboCrawler(String crawlPath, boolean autoParse) throws Exception { super(crawlPath, autoParse); cookie = WeiboCN.getSinaCookie("XXXXXXXXXXX", "XXXXXXXXXX");//賬號(hào)、密碼 } @Override public HttpResponse getResponse(CrawlDatum crawlDatum) throws Exception { HttpRequest request = new HttpRequest(crawlDatum); request.setCookie(cookie); return request.getResponse(); } public void visit(Page page, CrawlDatums next) { int pageNum = Integer.valueOf(page.getMetaData("pageNum")); Elements weibos = page.select("div.c");//或者Document doc = page.doc(); for (Element weibo : weibos) { System.out.println("第" + pageNum + "頁 " + weibo.text()); } } public static void main(String[] args) throws Exception { WeiboCrawler crawler = new WeiboCrawler("WeiboCrawler", false); crawler.setThreads(3);//線程數(shù) for (int i = 1; i <= 5; i++) {//爬取XXX前5頁 crawler.addSeed(new CrawlDatum("http://weibo.cn/zhouhongyi?vt=4&page=" + i).putMetaData("pageNum", i + "")); } //crawlerNews.setResumable(true);//斷點(diǎn)續(xù)爬 crawler.start(1); } }
import cn.edu.hfut.dmic.webcollector.net.HttpRequest; import cn.edu.hfut.dmic.webcollector.net.HttpResponse; import java.io.ByteArrayInputStream; import java.io.File; import java.util.Set; import javax.imageio.ImageIO; import org.openqa.selenium.By; import org.openqa.selenium.Cookie; import org.openqa.selenium.WebElement; import org.openqa.selenium.htmlunit.HtmlUnitDriver; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; /** * * @author Alex * */ public class WeiboCN { public static String getSinaCookie(String username, String password) throws Exception { HtmlUnitDriver driver = new HtmlUnitDriver();//加載Html解析驅(qū)動(dòng) driver.setJavascriptEnabled(true); driver.get("http://login.weibo.cn/login/"); WebElement ele = driver.findElementByCssSelector("img");//selenium選擇器 String src = ele.getAttribute("src"); String cookie = concatCookie(driver); HttpRequest request = new HttpRequest(src);//請求驗(yàn)證碼 request.setCookie(cookie); HttpResponse response = request.getResponse(); ByteArrayInputStream is = new ByteArrayInputStream(response.getContent()); BufferedImage img = ImageIO.read(is); is.close(); ImageIO.write(img, "png", new File("result.png")); String userInput = new CaptchaFrame(img).getUserInput(); //模擬表單登錄 WebElement mobile = driver.findElementByCssSelector("input[name=mobile]"); mobile.sendKeys(username); WebElement pass = driver.findElementByCssSelector("input[type=password]"); pass.sendKeys(password); WebElement code = driver.findElementByCssSelector("input[name=code]"); code.sendKeys(userInput); WebElement rem = driver.findElementByCssSelector("input[name=remember]"); rem.click(); WebElement submit = driver.findElementByCssSelector("input[name=submit]"); submit.click(); String result = concatCookie(driver); driver.close(); if (result.contains("gsid_CTandWM")) { return result; } else { throw new Exception("weibo login failed"); } } public static String concatCookie(HtmlUnitDriver driver) { SetcookieSet = driver.manage().getCookies(); StringBuilder sb = new StringBuilder(); for (Cookie cookie : cookieSet) { sb.append(cookie.getName() + "=" + cookie.getValue() + ";"); } String result = sb.toString(); return result; } //根據(jù)圖片生成窗體驗(yàn)證碼 public static class CaptchaFrame { JFrame frame;//窗口 JPanel panel;//面板 JTextField input;//輸入框 int inputWidth = 100; BufferedImage img; String userInput = null; public CaptchaFrame(BufferedImage img) { this.img = img; } public String getUserInput() { frame = new JFrame("輸入驗(yàn)證碼"); final int imgWidth = img.getWidth(); final int imgHeight = img.getHeight(); int width = imgWidth * 2 + inputWidth * 2; int height = imgHeight * 2+50; Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); int startx = (dim.width - width) / 2; int starty = (dim.height - height) / 2; frame.setBounds(startx, starty, width, height); Container container = frame.getContentPane(); container.setLayout(new BorderLayout()); panel = new JPanel() { @Override public void paintComponent(Graphics g) {//將圖片畫在面板上 super.paintComponent(g); g.drawImage(img, 0, 0, imgWidth * 2, imgHeight * 2, null); } }; panel.setLayout(null); container.add(panel); input = new JTextField(6); input.setBounds(imgWidth * 2, 0, inputWidth, imgHeight * 2); panel.add(input); JButton btn = new JButton("登錄"); btn.addActionListener(new ActionListener() {//注冊監(jiān)聽 public void actionPerformed(ActionEvent e) { userInput = input.getText().trim(); synchronized (CaptchaFrame.this) {//同步窗口釋放 CaptchaFrame.this.notify(); } } }); btn.setBounds(imgWidth * 2 + inputWidth, 0, inputWidth, imgHeight * 2); panel.add(btn); frame.setVisible(true); synchronized (this) { try { this.wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } } frame.dispose(); return userInput; } } }
大家注意password!這個(gè)name="password_9384"其中的數(shù)字是動(dòng)態(tài)生成的,每次請求都會(huì)變,所以上面代碼中的selenium選擇器要用input[type=password]。
先這樣吧,不太會(huì)寫文章,希望大家海涵。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66365.html
摘要:通用網(wǎng)絡(luò)爬蟲通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲,爬取對象從一些種子擴(kuò)充到整個(gè)。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會(huì)采取一定的爬取策略。介紹是一個(gè)國人編寫的強(qiáng)大的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的。 爬蟲 簡單的說網(wǎng)絡(luò)爬蟲(Web crawler)也叫做網(wǎng)絡(luò)鏟(Web scraper)、網(wǎng)絡(luò)蜘蛛(Web spider),其行為一般是先爬到對應(yīng)的網(wǎng)頁上,再把需要的信息鏟下來。 分類 網(wǎng)絡(luò)爬蟲按照系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)技術(shù),...
摘要:通用網(wǎng)絡(luò)爬蟲通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲,爬取對象從一些種子擴(kuò)充到整個(gè)。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會(huì)采取一定的爬取策略。介紹是一個(gè)國人編寫的強(qiáng)大的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的。 爬蟲 簡單的說網(wǎng)絡(luò)爬蟲(Web crawler)也叫做網(wǎng)絡(luò)鏟(Web scraper)、網(wǎng)絡(luò)蜘蛛(Web spider),其行為一般是先爬到對應(yīng)的網(wǎng)頁上,再把需要的信息鏟下來。 分類 網(wǎng)絡(luò)爬蟲按照系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)技術(shù),...
摘要:在本書中用到的一些服務(wù)程序主要有。本節(jié)來分別介紹它們的安裝方法。的安裝是一個(gè)輕量級(jí)的服務(wù)程序,簡單易用靈活,在本書中我們主要用它來做一些服務(wù),本節(jié)我們來了解下它的安裝方式。相關(guān)鏈接官方文檔安裝執(zhí)行完畢之后即可完成安裝。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---5、存儲(chǔ)庫的安裝:PyMySQL、PyMongo、RedisPy、RedisDump下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)-...
摘要:以下這些項(xiàng)目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過一遍Python最基本的知識(shí),比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:概述這是一個(gè)網(wǎng)絡(luò)爬蟲學(xué)習(xí)的技術(shù)分享,主要通過一些實(shí)際的案例對爬蟲的原理進(jìn)行分析,達(dá)到對爬蟲有個(gè)基本的認(rèn)識(shí),并且能夠根據(jù)自己的需要爬到想要的數(shù)據(jù)。 概述 這是一個(gè)網(wǎng)絡(luò)爬蟲學(xué)習(xí)的技術(shù)分享,主要通過一些實(shí)際的案例對爬蟲的原理進(jìn)行分析,達(dá)到對爬蟲有個(gè)基本的認(rèn)識(shí),并且能夠根據(jù)自己的需要爬到想要的數(shù)據(jù)。有了數(shù)據(jù)后可以做數(shù)據(jù)分析或者通過其他方式重新結(jié)構(gòu)化展示。 什么是網(wǎng)絡(luò)爬蟲 網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁...
閱讀 1723·2021-11-25 09:43
閱讀 2683·2019-08-30 15:53
閱讀 1833·2019-08-30 15:52
閱讀 2911·2019-08-29 13:56
閱讀 3335·2019-08-26 12:12
閱讀 579·2019-08-23 17:58
閱讀 2159·2019-08-23 16:59
閱讀 946·2019-08-23 16:21