اليوم ، تحتاج الشركة إلى القيام ببعض البيانات التي تجريف بعد الاستعلام على موقع الويب المحدد ، لذلك استغرق الأمر بعض الوقت لكتابة عرض تجريبي للاستخدام التوضيحي.
الفكرة بسيطة للغاية: إنها الوصول إلى الرابط من خلال Java ، ثم الحصول على سلسلة HTML ، ثم تحليل البيانات المطلوبة مثل الرابط. من الناحية الفنية ، فإن JSoup مريحة لتحليل الصفحة. بالطبع ، JSoup مريحة للغاية وبسيطة. يمكنك معرفة كيفية استخدامه مع سطر واحد فقط من التعليمات البرمجية:
مستند المستند = jsoup.connect ("http://www.oschina.net/") .Data ("Query" ، "java") // request parameters.useragent ("i 'm jsoup") // set user-agent .cookie ("auth" ، "token") // set time. // استخدم طريقة البريد للوصول إلى عنوان URL تم وصف عملية التنفيذ بأكملها أدناه:
1. تحليل الصفحات التي يجب تحليلها:
الموقع: http://www1.sxcredit.gov.cn/public/infocomquery.do؟method=publicIndexquery
صفحة:
أولاً ، قم بإجراء استعلام في هذه الصفحة: راقب عنوان URL المطلوب ، والمعلمات ، والطريقة ، إلخ.
هنا نستخدم أداة المطورين المدمجة (مفتاح الاختصار F12) ، وما يلي هي نتائج الاستعلام:
يمكننا أن نرى عنوان URL والطريقة والمعلمات. بعد معرفة كيف أو Query URL ، سأبدأ الرمز أدناه. من أجل إعادة الاستخدام والتمديد ، حددت عدة فصول:
1. القاعدة. java يستخدم لتحديد عنوان URL للاستعلام ، والطريقة ، والمعلمة ، إلخ.
حزمة com.zhy.spider.rule ؛ / ** * فئة القاعدة * * Author Zhy * */ قاعدة الفئة العامة {/ ** * Link */ private string url ؛ / ** * مجموعة المعلمة */ سلسلة خاصة [] params ؛ / *** القيم المقابلة للمعلمة*/ private string [] القيم ؛ / ** * لـ HTML المرتجعة ، يرجى تعيين النوع الأول */ سلسلة private ResultTagName ؛ / ** * class / id / selection * قم بتعيين نوع resulttagname ، افتراضيًا إلى ID * / private int type = id ؛ / ** *get / post *نوع الطلب ، الافتراضي get * / private int requestMoethod = get ؛ GETING Final Static int get = 0 ؛ Public Final Static int post = 1 ؛ فئة int النهائية العامة = 0 ؛ int static النهائي العام = 1 ؛ اختيار int النهائي العام = 2 ؛ القاعدة العامة () {} القاعدة العامة (url string ، string [] params ، string [] ، string resulttagname ، int type ، int requestMoethod) {super () ؛ this.url = url ؛ this.params = params ؛ this.values = القيم ؛ this.resultTagName = resultTagName ؛ this.type = type ؛ this.requestmoethod = requestMoethod ؛ } السلسلة العامة geturl () {return url ؛ } public void seturl (url url) {this.url = url ؛ } السلسلة العامة [] getParams () {return params ؛ } public void setParams (string [] params) {this.params = params ؛ } السلسلة العامة [] getValues () {return stable ؛ } public void setValues (string [] base) {this.values = stable ؛ } السلسلة العامة getResultTagName () {return resultTagName ؛ } public void setResultTagName (String resultTagName) {this.resultTagName = resultTagName ؛ } public int gettype () {return type ؛ } public void setType (int type) {this.type = type ؛ } public int getRequestMoethod () {return requestMoethod ؛ } public void setRequestMoethod (int requestMoethod) {this.requestmoethod = requestMoethod ؛ }}اسمحوا لي أن أضع باختصار: تحدد فئة القاعدة هذه جميع المعلومات التي نحتاجها أثناء عملية الاستعلام ، والتي تسهل تمديدنا وإعادة استخدام الكود. من المستحيل علينا أن نكتب مجموعة من التعليمات البرمجية لكل موقع ويب يحتاج إلى الزحف.
2. كائن البيانات المطلوب ، يحتاج حاليًا فقط إلى روابط ، linktypedata.java
حزمة com.zhy.spider.bean ؛ الطبقة العامة linktypedata {private int id ؛ / *** عنوان الارتباط*/ سلسلة خاصة LinkHref ؛ / *** عنوان الارتباط*/ سلسلة خاصة LinkText ؛ / *** ملخص*/ ملخص سلسلة خاصة ؛ / *** المحتوى*/ محتوى السلسلة الخاصة ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getLinkHref () {return LinkHref ؛ } public void setLinkHref (string linkhref) {this.linkhref = linkHref ؛ } السلسلة العامة getLinkText () {return LinkText ؛ } public void setLinkText (String linkText) {this.linktext = linkText ؛ } السلسلة العامة GetSummary () {ملخص الإرجاع ؛ } public void setSummary (ملخص سلسلة) {this.summary = summary ؛ } السلسلة العامة getContent () {return content ؛ } public void setContent (string content) {this.content = content ؛ }} 3. فئة الاستعلام الأساسية: extractservice.java
حزمة com.zhy.spider.core ؛ استيراد java.io.ioException ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ استيراد java.util.map ؛ استيراد javax.swing.plaf.textui ؛ استيراد org.jsoup.connection ؛ استيراد org.jsoup.jsoup ؛ استيراد org.jsoup.nodes.document ؛ استيراد org.jsoup.nodes.element ؛ استيراد org.jsoup.select.elements ؛ استيراد com.zhy.spider.bean.linktypedata ؛ استيراد com.zhy.spider.rule.rule ؛ استيراد com.zhy.spider.rule.ruleexception ؛ استيراد com.zhy.spider.util.textutil ؛ / ** * * * Author Zhy * */ extractservice class public {/ ** * param Rule * regurn */ قائمة ثابتة عامة <NinkTyPedAta> extract (قاعدة القاعدة) {// تنفيذ التحقق الضروري للقاعدة الصحيحة (القاعدة) ؛ قائمة <NinkTyPedata> datas = new ArrayList <LinkTyPedata> () ؛ بيانات LinkTyPledata = فارغة ؛ Try { / ** * parse rocle * / string url = rease.geturl () ؛ String [] params = rule.getParams () ؛ string [] القيم = rule.getValues () ؛ String resultTagName = rule.getResultTagName () ؛ int type = rule.gettype () ؛ int requesttype = rule.getRequestMoethod () ؛ Connection conn = jsoup.connect (url) ؛ // تعيين معلمات الاستعلام إذا (params! = null) {for (int i = 0 ؛ i <params.length ؛ i ++) {conn.data (params [i] ، القيم [i]) ؛ }} // ضبط نوع الطلب مستند مستند = null ؛ Switch (requesttype) {case rerce.get: doc = conn.Timeout (100000) .get () ؛ استراحة؛ قاعدة الحالة. post: doc = conn.timeout (1000000) .post () ؛ استراحة؛ } // Return Return Elements Results = New Elements () ؛ Switch (type) {case rule.class: النتائج = doc.getElementSbyClass (resultTagName) ؛ استراحة؛ قاعدة الحالة. النتائج. Add (النتيجة) ؛ استراحة؛ قاعدة الحالة. الإصلاح: النتائج = doc.select (resultTagName) ؛ استراحة؛ الافتراضي: // عندما تكون resultTagName فارغة ، يتم إهمال علامة الجسم إذا (textutil.isempty (resultTagName)) {النتائج = doc.getElementsByTag ("body") ؛ }} لـ (نتيجة العنصر: النتائج) {elements links = result.getElementSbyTag ("a") ؛ لـ (رابط العنصر: الروابط) {// المطلوبة string filter linkHref = link.attr ("href") ؛ سلسلة linkText = link.text () ؛ data = new LinkTypedata () ؛ data.setLinkHref (LinkHref) ؛ data.setLinkText (LinkText) ؛ data.add (البيانات) ؛ }}} catch (ioException e) {E.PrintStackTrace () ؛ } إرجاع البيانات ؛ } / *** قم بإجراء التحقق اللازم على المعلمات التي تم تمريرها* / private static void validate (Rule Rule) {String url = rule.geturl () ؛ if (textutil.isempty (url)) {رمي dretexception جديد ("url لا يمكن أن يكون فارغًا!") ؛ } if (! url.StartSwith ("http: //")) {رمي RuleException ("url غير صحيح!") ؛ } if (rule.getParams ()! = null && rule.getValues ()! = null) {if (rule.getParams (). length! = rule.getValues (). length) {throw recexception ("" القيمة الرئيسية للمعلمة لا تتطابق مع عدد المفاتيح والقيم! ") ؛ }}}}} 4. يتم استخدام فئة استثناء: RULEException.java
حزمة com.zhy.spider.rule ؛ يمتد القائم على الطبقة العامة RULEEXCESTION RUNTIMEEXCESTION {public recexception () {super () ؛ // TODO AUDALED CONTRUCTOR CONCED} RULEEXCESTION (رسالة السلسلة ، سبب رمي) {super (message ، cause) ؛ // TODO AUTO CONTRUCTOR CONCED} RULEEXCESTION (رسالة سلسلة) {Super (Message) ؛ // TODO AUTO CONTRUCTOR CONCTING} RULEEXCESTION (السبب القابل للتأمل) {super (cause) ؛ // TODO CONTRUCTOR COPTING}}}} 5. أخيرًا ، إنه اختبار: يتم استخدام موقعين على الويب للاختبار هنا ، ويتم استخدام قواعد مختلفة. يرجى الاطلاع على الرمز للحصول على التفاصيل.
حزمة com.zhy.spider.test ؛ استيراد java.util.list ؛ استيراد com.zhy.spider.bean.linktypedata ؛ استيراد com.zhy.spider.core.extractService ؛ استيراد com.zhy.spider.rule.rule ؛ اختبار الفئة العامة { @org.junit.test public void getDataSbyClass () {rerle rerle = new rease ("http://www1.sxcredit.gov.cn/public/infocomquery.do؟method=publicindexquery" ، new string [] {"quererprisename". string [] {"xingwang" ، "} ،" cont_right "، rease.class ، rule.post) ؛ artical <NinktypedAta> extracts = extractservice.extract (rule) ؛ printf (extracts) ؛} @org.junit.test public void getDatasbycsSquery () القاعدة ("http://www.11315/Search" ، سلسلة جديدة [] {"name"} ، {" printf (dataseplata> data (data. نتيجة الإخراج:
Shenzhen Netxing Technology Co. ، Ltd. Quanxing Internet Cafe# ***************************** Zichang County Xinxing Net City# ***************************** الاتجاه الثالث لشركة Shaanxi Tongxing Networding Information Co. *******************************:
أخيرًا ، استخدم أخبار Baidu لاختبار رمزنا: فهذا يعني أن رمزنا عالمي.
/*** استخدم Baidu News ، فقط قم بتعيين عنوان URL والكلمات الرئيسية وأنواع الإرجاع*/ @org.junit.test public void getDataSbycsSqueryUserBaidu () {rule rule = new rule ("http://news.baidu.com/ns القاعدة. قائمة <NinkTyPedata> المستخلصات = extractservice.extract (القاعدة) ؛ printf (مقتطفات) ؛ } نقوم فقط بتعيين الروابط والكلمات الرئيسية وأنواع الطلبات ، ولا نقوم بتعيين شروط مرشح محددة.
النتيجة: من المؤكد أن هناك بعض البيانات غير المرغوب فيها ، ولكن يجب أن تزحف البيانات المطلوبة. يمكننا تعيين القاعدة. القاعدة ، وكذلك مزيد من الحدود على الظروف تصفية.
الفرز حسب الوقت/ns؟ word = alipay & ie = utf-8 & bs = alipay & sr = 0 & cl = 2 & rn = 20 & tn = news & ct = 0 & clk = sortbytime ************************************* قم بتمويل مع عدة أطراف لاستثمار 40 مليون في الدفعة الأولى http://finance.ifeng.com/a/20140409/12081871_0.shtml ******************************* 7 نفسه news/ns؟ word = ٪ e6 ٪ 94 ٪ AF ٪ e4 ٪ bb ٪ 98 ٪ e5 ٪ ae ٪ 9d+cont: 2465146414 ٪ 7C6977779368 ٪ 7C3832159921 & same = 7 & cl = 1 & tn = rn = 30 & fm = لقطة http://cache.baidu.com/c؟m=9D78D513D9D437AB4F9E91697D1CC0161D4381132BA7D3020CD0870FD33A541 B0120A1AC26510D19879E20345DFE1E4BEA876D2605F75A09BBFD91782A6C1352F8A2432721A844A0FD019ADC 1452FC423875D9DAD0EE7CDB168D5F18C & P = C96EC64AD48B2DEF49BD9B780B64 & NEWP = C4769A4790934EA95E28E 281C4092695912C10E3DD796 & USER = BAIDU & FM = SC & QUERY = ٪ D6 ٪ A7 ٪ B6 ٪ B1 ٪ A6 & QID = A400F3660007A6C5 & P1 = 1 *********************************************** الطلب *******************************: لقطة http://cache.baidu.com/c؟m=9F65CB4A8C8507ED4FECE7631050803743438014678387492AC3333FC239045C1C3AA5ec 677E4742CE932B2152F4174BED84367034053B0EFCA8E57DFB08F29288F2C367117845615A71BB8CB31649B6CF04FDEA44 a7ecff25e5aac5a0da4323c044757e97f1fb4d7017dd1cf4 & p = 8b2a970d95df11a05aa4c32013 & newp = 9e39c64ad4dd50fa40 BD9B7C5253D8304503C52251D5CE042ACC & USER = BAIDU & FM = SC & QUERY = ٪ D6 ٪ A7 ٪ B6 B1 ٪ A6 & QID = A400F3660007A6C5 & P1 = 2 ***************************************** yahoo Japan تبدأ في دعم مدفوعات alipay من يونيو
إذا كان هناك أي عيوب ، فيمكنك الإشارة إليها ؛ إذا كنت تعتقد أنه من المفيد لك ، فيرجى تجربته ~~ هاها
قم بتنزيل رمز المصدر ، انقر هنا.
ما سبق هو مثال على معلومات الزاحف Java. سنستمر في إضافة المعلومات ذات الصلة في المستقبل. شكرا لك على دعمك لهذا الموقع!