Vor kurzem muss ich die Artikelinformationen des WeChat -offiziellen Kontos kriechen. Ich suchte online und stellte fest, dass die Schwierigkeit, öffentliche WeChat -Konten in WeChat zu kriechen, darin besteht, dass der Link zum offiziellen Kontoartikel auf der PC -Seite nicht eröffnet werden kann. Wir müssen den eigenen Browser von WeChat verwenden (Sie können ihn nur auf anderen Plattformen öffnen, nachdem Sie die vom WeChat -Client ergänzten Parameter erhalten haben). Dies verursacht das Crawler -Programm große Probleme. Später sah ich ein offizielles WeChat -Account Crawling -Programm, das von einem großen Mann auf Zhihu geschrieben wurde, und folgte direkt der Idee des Chefs und verwandelte es in Java. Ich habe während der Transformation viele detaillierte Probleme gestoßen, also werde ich es teilen.
Die Grundidee des Systems besteht darin, WeChat auf dem Android -Emulator auszuführen, einen Proxy für den Emulator einzurichten, WeChat -Daten über den Proxy -Server abzufangen und die erhaltenen Daten zur Verarbeitung an Ihr eigenes Programm zu senden.
Umgebungen, die vorbereitet werden müssen: Nodejs, Anyproxy -Proxy und Android -Emulator
NodeJS Download -Adresse: http://nodejs.cn/download/. Ich habe die Windows -Version heruntergeladen, installieren Sie sie einfach direkt. Nach der Installation konfiguriert das Ausführen von C:/Programmdateien/NODEJS/NPM.CMD die Umgebung automatisch.
Installation von AnyProxy: Führen Sie nach dem Installieren von NodeJs gemäß dem vorherigen Schritt NPM -Installation -g -Anyproxy direkt in CMD und installieren Sie aus und installieren Sie sie
Gehen Sie einfach online zum Android Emulator, viele von ihnen.
Installieren Sie zunächst das Zertifikat für den Proxy -Server. AnyProxy löst den HTTPS -Link standardmäßig nicht auf. Nach der Installation des Zertifikats kann es gelöst werden. Führen Sie AnyProxy -Root in CMD aus, um das Zertifikat zu installieren. Danach müssen Sie dieses Zertifikat im Emulator herunterladen.
Geben Sie dann den Befehl anProxy -i ein, um den Proxy -Dienst zu öffnen. (Denken Sie daran, Parameter hinzuzufügen!)
Denken Sie an diese IP und diesen Port, und dann wird der Agent des Android -Emulators dies verwenden. Verwenden Sie nun Ihren Browser, um die Webseite zu öffnen: http: // localhost: 8002/Dies ist die Weboberfläche von AnyProxy, mit der HTTP -Übertragungsdaten angezeigt werden.
Klicken Sie im roten Feld oben auf das Menü und ein QR -Code wird veröffentlicht. Verwenden Sie den Android -Emulator, um den Code zu scannen, um ihn zu identifizieren. Der Emulator (Mobiltelefon) lädt das Zertifikat herunter und installiert es einfach.
Jetzt sind Sie bereit, einen Proxy für den Emulator einzurichten. Die Proxy -Methode ist auf manuell eingestellt. Die Proxy -IP ist die IP, die Anyproxy -Maschine ausführt, und der Port ist 8001
Die Vorbereitungsarbeiten werden hier im Grunde genommen abgeschlossen. Öffnen Sie WeChat im Emulator und öffnen Sie einen Artikel auf einem öffentlichen Konto. Sie können die von AnyProxy erfassten Daten von der gerade geöffneten Weboberfläche sehen:
Der Link zum WeChat -Artikel befindet sich im roten Box oben. Klicken Sie in die spezifischen Daten. Wenn nichts in der Reaktionsbehörde vorhanden ist, gibt es ein Problem mit der Zertifikatinstallation.
Wenn alle oben genannten erledigt sind, können Sie weiter nach unten gehen.
Hier verlassen wir uns auf Proxy -Dienste, um WeChat -Daten zu erfassen, aber wir können keine Daten erfassen und WeChat selbst bedienen. Es ist besser, es manuell zu kopieren. Deshalb brauchen wir den WeChat -Client, um auf die Seite zu springen. Zu diesem Zeitpunkt können Sie AnyProxy verwenden, um die vom WeChat -Server zurückgegebenen Daten abzufangen, den Seitensprungcode in sie zu injizieren und dann die verarbeiteten Daten an den Simulator zurückzugeben, um den automatischen Sprung des WeChat -Clients zu erreichen.
Öffnen Sie eine JS -Datei namens Rule_Default.js in AnyProxy. Die Datei unter Windows lautet: C:/Benutzer/Administrator/AppData/Roaming/NPM/NODE_MODULES/ENGEPROXY/LIB
Es gibt eine Methode namens ErsatzerverresDataaSync: Funktion (Req, Res, ServerResData, Rückruf) in der Datei. Diese Methode ist für die Durchführung verschiedener Vorgänge für die von AnyProxy erhaltenen Daten verantwortlich. Zu Beginn sollte es nur einen Rückruf geben (serverresdata). Diese Anweisung bedeutet, die Serverantwortdaten direkt an den Client zurückzugeben. Löschen Sie diese Anweisung direkt und ersetzen Sie sie durch den von Daniu geschriebenen Code. Ich habe hier keine Änderungen am Code vorgenommen, und die Kommentare darin werden sehr deutlich erklärt. Lesen Sie sie einfach direkt nach Logik durch, und es gibt kein großes Problem.
ersetzterverresdataaSync: function (req, res, serverresdata, callback) {if (/mp/getmassendmsg/i.test (req.url))) {// Wenn die Link -Adresse die offizielle Account Historical Message -Seite (erste Seite) ist (Formular für erste Seite) //console. if (serverresdata.toString ()! Httppost (ret [1], req.url, "/internetspider/getData/showbiz"); // Diese Funktion wird später definiert, wobei die passende historische Nachricht JSON an seinen eigenen Server var http = Request ('http') sendet; http.get ('http: // xxx/getwxhis', function (res) {// Diese Adresse ist ein Programm auf seinem eigenen Server. Ziel ist es, die nächste Linkadresse zu erhalten, die Adresse die Adresse in ein JS -Skript zu platzieren und automatisch auf die nächste Seite zu springen. Der Prinzip von getwxhis.php wird später eingeführt. Callback (Chunk+ServerResData); // Einfügen des zurückgegebenen Codes in die historische Nachrichtenseite ein und kehren Sie zurück, um es anzuzeigen})}); } catch (e) {// Wenn der oben genannte Regular nicht übereinstimmt, kann der Inhalt dieser Seite die zweite Seite der historischen Nachrichtenseite des offiziellen Kontos sein, da sich die erste Seite der historischen Nachricht im HTML -Format befindet und die zweite Seite im JSON -Format ist. //console.log("Start Die erste Seite kriechet nach unten "); try {var json = json.parse (serverresData.toString ()); if (json.Ageneral_msg_list! Callback (ServerResData); // kehren Sie direkt zum zweiten Seite zurück. } else if (/mp//profile_ext/?action=home/i.test (req.url)) {// Wenn die Linkadresse die offizielle Seite Historischer Nachrichten ist (Formular der zweiten Seite), try {var reg =/var msglist = /'(.*? reg.exec (serverresdata.toString ()); // Die Variable in String httppost (ret [1], req.url, "/xxx/showbiz"); // Diese Funktion ist später definiert, senden Sie die passende historische Nachricht JSON JSON. http.get ('xxx/getwxhis', function (res) {// Diese Adresse ist ein Programm auf Ihrem Server. Der Zweck besteht darin, die nächste Linkadresse zu erhalten, die Adresse in ein JS -Skript zu platzieren und automatisch auf die nächste Seite zu springen. Das Prinzip von getwxhis.php wird später eingeführt. Res.on. in die historische Nachrichtenseite und kehren Sie zurück, um es anzuzeigen})}); } catch (e) {//console.log(E); Callback (ServerResData); }} else if (/mp//profile_ext/?action=getMsg/i.test (req.url)) {// Der Ausdruck der zweiten Seite json try {var json = json.parse (serverresdata.toString ()); if (json.General_msg_list! } callback (serverresData); } else if (/mp//getAppmsgext/i.test (req.url)) {// Wenn die Link -Adresse die Anzahl der Ansichten und Likes für den offiziellen Account -Artikel ist, probieren Sie {httppost (ServerresData, Req.url, "/xxx/Getmsxext"). Server} catch (e) {} callback (serverresData); } else if (/s/? __ biz/i.test (req.url) || /mp//rumor/i.test(req.url)) <//when die Linkadresse ist der offizielle Konto -Artikel (die Rumor -Adresse ist der offizielle Account -Artikel. http.get ('http: // xxx/getwxpost', function (res) {// Diese Adresse ist ein weiteres Programm auf Ihrem Server. Der Zweck der nächsten Linkadresse, die Adresse in ein JS -Skript einlegen und automatisch auf die nächste Seite springen. Der Prinzip von getwxpost.php wird später eingeführt. })}); } catch (e) {callback (serverresData); }} else {callback (serverresData); } // Callback (ServerResData); },Lassen Sie mich hier kurz erklären, dass es zwei Formen von Links zur historischen Nachrichtenseite der offiziellen WeChat -Konten gibt: Man beginnt mit mp.weixin.qq.com/mp/getmassendmsg und der andere beginnt mit MP.weixin.qqq.com/mp/profile_ext. Die History -Seite kann umgedreht werden. Wenn es umgedreht wird, wird das JS -Ereignis ausgelöst, um eine Anfrage zu senden, um JSON -Daten zu erhalten (den Inhalt der nächsten Seite). Es gibt auch offizielle Konto -Artikel -Links sowie Links zur Anzahl der gelesenen Artikel und Likes (Rückgabe von JSON -Daten). Die Formen dieser Links sind festgelegt und können durch logisches Urteilsvermögen unterschieden werden. Hier gibt es eine Frage: Wie es zu tun ist, wenn alle Geschichtsseiten gekrabbelt werden müssen. Meine Idee ist es, die Maus zu simulieren, die durch JS rutscht und so die Anfrage zur Einreichung einer Anfrage zum Laden des nächsten Teils der Liste ausgelöst hat. Oder verwenden Sie direkt anwesend, um die Anforderung zum Schieben von Laden zu analysieren und diese Anforderung direkt an den WeChat -Server zu generieren. Es gibt jedoch ein Problem damit, wie man beurteilt, dass es keine verbleibenden Daten gibt. Ich krieche die neuesten Daten und habe vorerst diese Anforderung nicht und ich möchte es vielleicht in Zukunft. Wenn Sie es brauchen, können Sie es versuchen.
Die folgende Abbildung ist der Inhalt der obigen HTTPPOST -Methode.
Funktion HTTPPOST (STR, URL, Pfad) {// JSON an den Server senden, Str ist JSON -Inhalt, URL ist die historische Nachrichtenseitenadresse, Pfad und Dateiname des Empfangsprogramms ist
console.log ("Start weiterleitet");
versuchen{
var http = required ('http');
var data = {
STR: Encodeuricomponent (STR),
URL: Encodeuricomponent (URL)
};
Data = Request ('QueryString'). Stringify (Daten);
var options = {
Methode: "Post",
Host: "xxx", // Beachten Sie, dass es keine http: // gibt, dies ist der Domänenname des Servers.
Port: xxx,
Pfad: Pfad, // der Pfad und den Dateinamen des Empfangsprogramms
Header: {
'Content-Typ': 'Anwendung/x-www-form-urlencoded; charset = utf-8 ',
"Inhaltslänge": Data.Length
}
};
var req = http.request (Optionen, Funktion (res) {
res.setencoding ('utf8');
res.on ('Daten', Funktion (Chunk) {
console.log ('Body:' + Chunk);
});
});
Req.on ('Fehler', Funktion (e) {
console.log ('Problem mit Anfrage:' + e.message);
});
Req.Write (Daten);
req.end ();
} catch (e) {
console.log ("Fehlermeldung:"+e);
}
console.log ("Weiterleitungsoperation endet");
}Nach der oben genannten Arbeit besteht der nächste Schritt darin, den Servercode gemäß Ihrem eigenen Geschäft zu vervollständigen. Unser Dienst wird verwendet, um Daten zu empfangen, die vom Proxy -Server zur Verarbeitung gesendet, persistente Vorgänge ausführen und gleichzeitig den JS -Code senden müssen, der in WeChat an den Proxy -Server eingebracht werden muss. Für Daten, die von verschiedenen Links gesendet wurden, die vom Proxy -Server abgefangen wurden, müssen wir entsprechende Methoden entwerfen, um diese Daten zu verarbeiten. Aus der JS -Methode von Antragoxy zur Verarbeitung von WeChat -Daten ersetzterverresDataaSync: Funktion (Req, Res, ServerresData, Rückruf) können wir wissen, dass mindestens drei Methoden erforderlich sind, um die Daten des offiziellen Kontos, Daten des offiziellen Kontos zu entwerfen, offizielle Konto -Artikel -Seite, offizielle Kontoartartikel und Lesen Daten. Gleichzeitig müssen wir auch eine Methode entwickeln, um Kriechungsaufgaben zu generieren und das Hin- und Rückflug des offiziellen Kontos zu erledigen. Wenn Sie mehr Daten kriechen müssen, können Sie mehr benötigte Daten aus den von AnyProxy erfassten Links analysieren und dann ein Urteil hinzufügen, um den Ersatz zu ersetzen: Funktion (Req, Res, ServerResData, Rückruf), die erforderlichen Daten abfangen und an Ihren eigenen Server senden und die entsprechende Methode hinzufügen, um diese Art der Daten auf dem Server zu verarbeiten.
Ich schreibe Servercode in Java.
Methoden zur Verarbeitung offizieller Kontoverlaufseiten Daten:
public void getmsgjson (String str, String url) löst nicht unterstütztenCodingException {// Todo automatisch generierte Methode Stub String biz = "" aus; Map <String, String> queryStrs = httpurlParser.Parseurl (URL); if (queryStrs! = null) {biz = queryStr.get ("__ biz"); biz = biz + "=="; } /*** Abfragen Sie aus der Datenbank, ob Biz bereits existiert, und fügen Sie sie ein, wenn sie nicht existiert. * Dies bedeutet, dass wir ein neues offizielles Konto für das Sammelziel hinzugefügt haben. */ List <weixin> resultes = wixinMapper.SelectByBiz (Biz); if (Ergebnisse == null || results.size () == 0) {wixin weixin = new wexin (); wixin.setbiz (biz); wixin.setCollect (System.currentTimemillis ()); wixinmapper.insert (wixin); } //System.out.println(str); // STR -Variablenliste <objekt> lists = jsonPath.read (str, "['list']"); für (Objektliste: Listen) {Objekt json = list; int type = jsonPath.read (json, "['comm_msg_info'] ['type']"); if (type == 49) {// type = 49 bedeutet, dass es sich um eine Textnachrichtstring content_url = jsonPath.read (json, "$ .app_msg_info.content_url"); content_url = content_url.replace ("//", "") .replaceAll ("amp;", ""); // Die Linkadresse der Textnachricht int is_multi = jsonpath.read (json, "$ .app_msg_info.is_multi"); // // IS eine multi -Gerg-Nachricht insger. "$ .comm_msg_info.datetime"); // Zeit des Bild- und Textnachrichtes senden/** * Hier wird die Bild- und Textnachrichtslinkadresse in die Erwerbswarteschlange Bibliothek getroffen. null &&! "". Equals (content_url)) {tmplist tmplist = new tmplist (); tmplist.setContenturl (content_url); tmplistMapper.insertSelective (tmplist); }} catch (Ausnahme e) {System.out.println ("Die Warteschlange existiert bereits, nicht eingefügt!"); } / *** Hier beurteilen wir, ob es aus dem Datenbankbeitrag basierend auf $ content_url* / list <post> postlist = postmapper.SelectByContenturl (content_url) wiederholt wird. boolean contenturlexist = false; if (postlist! = null && postlist.size ()! = 0) {contenturlexist = true; } if (! contenturlexist) {// 'Das gleiche $ content_url existiert in der Datenbank post' Integer FileId = jsonPath.read (json, $ .app_msg_inte_info.FileId "); // a WeChat -String -Titel = jsonpatheD.Read (Json, $. Urlencoder.encode (Titel, "UTF-8"); String digest = jsonPath.read (json, "$ .app_msg_ext_info.Digest"); // article summary string scry_url = jsonpath.read (JSON, "$ .app_msg_t.info.source_url"); // Die Original -Textverbindung Link Sourc. String cover = jsonPath.read (JSON, "$ .app_msg_ext_info.cover"); // Cover Bild Cover = Cover.Replace ("//", ""); /*** in der Datenbank speichern* /// system.out.println ("title:"+tital); // system.out.println ("WeChat id:"+fileId); // system.out.println ("Artikel Zusammenfassung:"+Digest); // system.println ("Lesen Sie Original Link:"++Quelle_url); Adresse: "+Cover); Post post = new post (); post.setbiz (biz); Post.Settitle (Titel); post.settitleEncode (title_encode); post.setfieldId (FileId); post.setDigest (Digest); post.setSourceURL (Source_url); post.setcover (Cover); post.setistop (1); // markieren Sie es als Headline -Inhalt post.setismulti (is_multi); post.setDatetime (datetime); post.setContenturl (content_url); postmapper.insert (post); } if (is_multi == 1) {// Wenn es sich um eine multi -graphische Nachrichtenliste <Objekt> multilisten = jsonpath.read (json, "['app_msg_inte_info'] ['multi_app_msg_item_list']") "); für (Objekt multilist: multilisten) {Object multijson = multilist; content_url = jsonPath.read (multijson, "['content_url']"). toString (). Ersetzen ("//", "") .Replaceall ("AMP;", ""); // Grafische Nachrichtenverbindungsadresse/*** Hier werden wir beurteilen, ob die Datenbank auf basierend auf $ content_url wiederholt wird. Liste <Post> post> postMapper.SelectByContenturl (content_url); if (posts! = null && posts.size ()! = 0) {contenturlexist = true; } if (! contenturlexist) {// 'Das gleiche $ content_url ist in der Datenbank nicht vorhanden. ! "". Equals (content_url)) {tmplist tmplistt = new tmplist (); tmplistt.setContenturl (content_url); tmplistMapper.insertSelective (tmplistt); } String title = jsonPath.read (multijson, "$ .title"); String title_encode = urlencoder.encode (Titel, "utf-8"); Integer FileId = jsonPath.read (Multijson, "$ .FilEID"); String digest = jsonPath.read (Multijson, "$ .Digest"); String source_url = jsonPath.read (Multijson, "$ .source_url"); source_url = source_url.replace ("//", ""); String Cover = jsonPath.read (Multijson, "$ .cover"); Cover = Cover.Replace ("//", ""); // system.out.println ("title:"+title); // system.out.println ("wechat id:"+fileId); // system.out.println ("Article Summary:"+Digest); // system.out.println ("Read Original Link:"+Source_url); Post post = new post (); post.setbiz (biz); Post.Settitle (Titel); post.settitleEncode (title_encode); post.setfieldId (FileId); post.setDigest (Digest); post.setSourceURL (Source_url); post.setcover (Cover); post.setistop (0); // tag es ist nicht der Headline -Inhalt post.setismulti (is_multi); post.setDatetime (datetime); post.setContenturl (content_url); postmapper.insert (post); }}}}}}}}}}Wie man mit offiziellen Konto -Artikelseiten umgeht:
public String getWxPost () {// Todo automatisch generierte Methode Stub / *** Wenn die aktuelle Seite der offiziellen Account-Artikel ist, lesen Sie dieses Programm* zuerst die Zeilenlast = 1 in der Sammlung Warteschlangenliste* Wählen Sie mehrere Zeilen gemäß "Order by id asc" aus der Warteschlangenliste (beachten Sie, dass diese Linie unterscheidet, dass diese Zeile unterscheidet. Liste <Tmplist> queues = tmplistMapper.SelectMany (5); String url = ""; if (Warteschlangen! = null && queues.size ()! url = queue.getContenturl (); Queue.SetIsLoad (1); int result = tmPlistMapper.UpdatByprimaryKey (Warteschlange); System.out.println ("Aktualisierungsergebnis:"+Ergebnis); } else {System.out.println ("GetPost -Warteschlangen ist null?"+queues == null? null: queues.size ()); Wixin wixin = wixinmapper.selectone (); String biz = wixin.getBiz (); if ((math.random ()> 0.5? 1: 0) == 1) {url = "http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=" + biz + "#wechat_webview_type = 1 & wechat_REDRECT teurte teurte. url = "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=" + biz + "#wechat_redirect"; // Teilen Sie die URL -Adresse des offiziellen Kontos Historische Nachricht (zweite Seite)} url = "https://mp.weixin.qqq.com/mp/profile_ext?action=home&__biz=" + biz + "#wechat_redirect"; // Teilen Sie die URL -Adresse der offiziellen Konto -Historische Nachricht (das zweite Seitenformular) // Aktualisieren Sie die Sammlung Zeitzeit in der offiziellen Konto -Tabelle, die gerade bis zum aktuellen Zeitstempel erwähnt wird. wixin.setCollect (System.currentTimemillis ()); int result = wixInmapper.UpdatByprimaryKey (Wexin); System.out.println ("getPost wexin updateresult:"+result); } int randomtime = new random (). NextInt (3) + 3; String jSCODE = "<Script> setTimeout (function () {window.location.href = '"+url+"';},"+randomtime*1000+"); </script>"; return JSCODE; }Wie man mit der Anzahl der Likes und Lesungen offizieller Konten umgeht:
public void getmsgext (String str, String url) {// Todo automatisch generierte Methode Stub String biz = ""; String sn = ""; Map <String, String> queryStrs = httpurlParser.Parseurl (URL); if (queryStrs! = null) {biz = queryStr.get ("__ biz"); biz = biz + "=="; sn = queryStr.get ("sn"); sn = "%" + sn + "%"; } /** * $ sql = "SELECT * aus" Artikel Tabelle "wobei` biz` = '". * Finden Sie den entsprechenden Artikel basierend auf Biz und Sn*/ post post = postmapper.SelectByBizandsn (Biz, SN); if (post == null) {System.out.println ("biz:"+biz); System.out.println ("sn:"+sn); tmplistMapper.DeleteByload (1); zurückkehren; } // system.out.println ("JSON -Daten:"+str); Ganzzahl read_num; Ganzzahl wie_num; Versuchen Sie {read_num = jsonpath.read (str, "['AppmsSGstat'] ['read_num']"); // les les volume wie_num = jsonPath.read (str, "['AppmsGstat'] ['Like_num']"); // LOBEL} catch (Exception E) {Lesel. System.out.println ("read_num:"+read_num); System.out.println ("Like_num:"+Like_num); System.out.println (e.getMessage ()); } /*** Hier wird der entsprechende Artikel auch in der Liste der Sammelwarteschlangen basierend auf SN gelöscht, was bedeutet, dass dieser Artikel aus der Sammelwarteschlange entfernt werden kann. * $ sql = "Aus" Teamliste "löschen, wobei` content_url` wie '%'. // dann die Anzahl der Ansichten und Likes in der Artikeltabelle aktualisieren. post.setReadnum (read_num); post.setlikenum (like_num); postmapper.UpdateByprimaryKey (post); }Wie man den Sprung zur WeChat -Injektion JS bezieht:
public String getWxhis () {String url = ""; // TODO Auto-generierter Methode Stub /*** Wenn die aktuelle Seite eine historische Nachricht für öffentliche Kontoe ist, lesen Sie dieses Programm* Es befindet sich ein Lastfeld in der Liste der Sammelwarteschlangen. Wenn der Wert gleich 1 ist, bedeutet dies, dass er gelesen wird. Tmplist queue = tmplistMapper.Selectrandomone (); System.out.println ("Warteschlange ist null?"+Warteschlange); if (queue == null) {// Die Warteschlangenliste ist leer/*** Wenn die Warteschlangenliste leer ist, holen Sie sich ein Biz aus der Tabelle, in der das offizielle Account -Biz gespeichert wird. * Hier habe ich ein Zeitfeld der Sammelzeit in der offiziellen Kontotabelle festgelegt. Nachdem Sie es in positiver Reihenfolge sortiert haben, erhalten Sie die Aufzeichnung des offiziellen Kontos mit dem kleinsten Zeitstempel und erhalten Sie das Biz */ wixin weixin = wixinmapper.Selectone (); String biz = wixin.getBiz (); url = "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=" + biz + "#wechat_redirect"; // Teilen Sie die offizielle Konto -Historische Nachrichten -URL -Adresse (das zweite Seitenformular aktualisieren). wixin.setCollect (System.currentTimemillis ()); int result = wixInmapper.UpdatByprimaryKey (Wexin); System.out.println ("Gethis wixin updateresult:"+result); } else {// Erhalten Sie das Feld content_url der aktuellen Zeilen -url = queue.getContenturl (); // Das Lastfeld auf 1 tmplistMapper aktualisieren. } // Ändern Sie die nächste $ URL, die in ein JS -Skript umgeleitet werden soll, und injizieren Sie sie von AnyProxy in die WeChat -Seite. // echo "<Script> setTimeout (function () {window.location.href = '". $ url. "';}, 2000); </script>"; int randomtime = new random (). NextInt (3) + 3; String jSCODE = "<Script> setTimeout (function () {window.location.href = '"+url+"';},"+randomtime*1000+"); </script>"; return JSCODE; }Das obige ist das Programm, das die vom Proxy -Server abgefangenen Daten verarbeitet. Es gibt ein Problem, auf das hier geachtet werden muss. Das Programm führt einen Round-Robin-Zugriff auf jedes in der Datenbank enthaltene offizielle Konto durch, und selbst auf die gespeicherten Artikel werden erneut zugegriffen. Ziel ist es, die Anzahl der Ansichten und Likes des Artikels weiter zu aktualisieren. Wenn Sie eine große Anzahl von öffentlichen Konten kriechen müssen, wird empfohlen, den Code so zu ändern, dass Taskwarteschlangen hinzugefügt und bedingte Einschränkungen hinzufügen. Andernfalls kriecht das offizielle Konto doppelte Daten in mehreren Runden und Zyklen beeinflussen die Effizienz stark.
Zu diesem Zeitpunkt wurden alle Artikellinks des WeChat -offiziellen Account gekrabbt, und dieser Link ist dauerhaft gültig und kann im Browser geöffnet werden. Schreiben Sie als nächstes ein Crawler -Programm, um den Artikelinhalt und andere Informationen aus der Datenbank zu kriechen.
Ich bin ein Crawler in WebMagic, es ist leicht und einfach zu bedienen.
Public Class Spidermodel implementiert PageProcessor {private statische Postmapper -Postmapper; private statische Liste <Post> Beiträge; // Relevante Konfiguration der Crawl -Website, einschließlich Codierung, Crawl -Intervall, Wiederholungszeiten usw. Private Site Site = Site.me (). Die öffentliche Website GOTSite () {// Todo automatisch generierte Methode Stub return this.Site; } public void Process (Seite Seite) {// Todo automatisch generierte Methode Stub post = posts.remove (0); String content = page.gethtml (). Xpath ("// div [@id = 'js_content']"). Get (); // Harry -Artikel werden hier bestimmt. Wenn es einen direkten Löschdatensatz gibt oder das Darstellungsbit festlegt, um anzuzeigen, dass der Artikel harmonisch ist, wenn (content == null) {System.out.println ("Der Artikel ist harmonisch!"); //postmapper.deleteByprimaryKey (post.getId ()); zurückkehren; } String contentsnap = content page.gethtml (). xpath ("// div [@id = 'meta_content']"); String pubtime = null; String wxName = null; String Author = null; if (metacontent! if (pubtime! if (wxName! if (Autor! String title = post.gettitle (). ErsatzEll ("", ""); // article title string digest = post.getDigest (); // article summary int lidenum = post.getlikenum (); // article mag int in readnum = post.getReadnum (); // article contentUrl = postobeNum.getaTenturl (); neuer Wechatinfobean (); Wechatbean.Settitle (Titel); WeChatbean.setContent (contentTxt); // Klartext Inhalt WeChatbean.setSourceCode (ContentsNap); // Snapshot WeChatbean.setlikeCount (Sklampfen); WeChatbean.setViewCount (Readnum); WeChatbean.setAbStractText (Digest); // abstrakte Wechatbean.seturl (contenturl); Wechatbean.setPublishTime (Pubime); WeChatbean.Setsitename (WXName); // Site -Name öffentlicher Kontoname Wechatbean.setAuthor (Autor); WeChatbean.SetMediType ("WeChat Official Account"); // Quellmedientyp WeChatStorage.SavewechatInfo (WeChatbean); // Tag Tag Der Artikel wurde nach. postmapper.UpdateByprimaryKey (post); } public static void startspider (Liste <Post> Inposts, Postmapper myPostMapper, String ... URLs) {Long Start Time, Endime; startTime = system.currentTimemillis (); postmapper = myPostmapper; Beiträge = Inposts; HttpclientDownloader httpclientDownloader = new httpclientDownloader (); Spidermodel Spidermodel = neuer Spidermodel (); Spider myspider = spider.create (spidermodel) .addurl (URLs); myspider.setDownloader (httpclientDownloader); Versuchen Sie {spidermonitor.instance (). Register (MySpider); myspider.thread (1) .run (); } catch (jMException e) {e.printstacktrace (); } endTime = system.currentTimemillis (); System.out.println ("Crawl Time" + ((Endime-StartTime) / 1000) + "Sekunden-"); }}Ich werde keine anderen irrelevanten Logikspeichercodes veröffentlichen. Hier habe ich die vom Proxy -Server erfassten Daten in MySQL eingerichtet und die von meinem Crawler -Programm in MongoDB gekrabbten Daten gespeichert.
Im Folgenden finden Sie die Informationen über die offizielle Kontonummer, die Sie gekrabbt haben: