1. المتطلبات والتكوين
المتطلبات: قم بزحف المعلومات الموجودة على صفحة البحث في الهاتف المحمول JD ، وتسجيل الاسم والسعر وعدد التعليقات ، وما إلى ذلك من كل هاتف محمول ، وتشكيل جدول بيانات يمكن استخدامه للتحليل الفعلي.
باستخدام Maven Project ، سجلات Log4J ، يتم تصدير السجلات إلى وحدة التحكم فقط.
يعتمد Maven على النحو التالي (pom.xml)
<ependencies> <Rependency> <roupiD> org.apache.httpcomponents </groupId> <StifactId> httpclient </shuntifactid> <splection> 4.5.3 </version> </rependency> <! <StifactId> jsoup </artifactId> <الإصدار> 1.11.2 </version> </sependency> <!-https://mvnrepository.com/artifact/log4j/log4j-> <sperimenced> <roupency> log4j </groupid> </التبعيات>
تكوين log4j (log4j.properties) ، معلومات الإخراج وما فوق معلومات المستوى إلى وحدة التحكم ، ولا تقم بتعيين مستند الإخراج بشكل منفصل.
log4j.rootlogger = info ، وحدة التحكم #Console log4j.appender.console = org.apache.log4j.consoleAppenderLog4j.appender.console.layout = org.apache.log4j.patternlayoutlog4j.appender.console.consoleout.conversion.
2. تحليل المتطلبات والرمز
2.1 تحليل المتطلبات
الخطوة الأولى هي إنشاء اتصال بين العميل والخادم ، والحصول على محتوى HTML على صفحة الويب من خلال عنوان URL.
الخطوة الثانية هي تحليل محتوى HTML والحصول على العناصر المطلوبة.
تتمثل الخطوة الثالثة في إخراج محتوى HTML إلى مستند النص المحلي ويمكن تحليله مباشرة من خلال برامج تحليل البيانات الأخرى.
وفقًا للتحليل أعلاه ، يتم إنشاء أربعة فئات ، GethTML (المستخدمة للحصول على موقع HTML) ، ParseHTML (المستخدمة في تحليل HTML) ، Writeto (المستخدمة في المستندات الإخراج) ، و MainControl (المستخدمة للتحكم). فيما يلي أربعة فصول. لجعل الكود موجزًا قدر الإمكان ، يتم إلقاء جميع الاستثناءات مباشرة من الطريقة دون الصيد.
2.2 رمز
2.2.1gethtml فئة
تحتوي هذه الفئة على طريقتين: GETH (url url) ، urlcontrol (سلسلة baseurl ، int page) ، والتي تستخدم على التوالي للحصول على صفحة الويب HTML وعنوان URL للتحكم. نظرًا لأن محتوى صفحة الويب المزروعة هذه المرة هو فقط نتائج البحث لنوع معين من المنتجات على jd.com ، فليست هناك حاجة لاجتياز جميع عناوين URL على الصفحة. تحتاج فقط إلى مراقبة التغييرات في عنوان URL عند قلب الصفحة وإدخال القواعد. يتم تعرض طريقة URLControl فقط للخارج ، ويتم تعيين خاصية سجل خاصة في الفصل: Logger static private = logger.getLogger (gethtml.class) ؛ يستخدم لتسجيل سجلات.
Geth (url url) ، احصل على محتوى HTML لعنوان URL واحد.
URLControl (سلسلة baseurl ، int) ، تقوم بتعيين الحلقة والوصول إلى بيانات صفحات متعددة. من خلال مراجعة العناصر ، يمكنك أن ترى أن التغيير في صفحة صفحة البحث على jd.com هو في الواقع تغيير بترتيب غريب.
إذا نظرت إلى التغييرات في عنوان URL بعد النقر ، فستجد أن التغيير الفعلي هو قيمة سمة الصفحة. عن طريق الربط ، يمكنك بسهولة الحصول على عنوان صفحة الويب التالية.
https://search.jd.com/search؟keyword=٪E6٪89٪8B٪E6٪9C٪BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page= 3&s=47&click=0
https://search.jd.com/search؟keyword=٪E6٪89٪8B٪E6٪9C٪BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=5&s=111&click=0
https://search.jd.com/search؟keyword=٪E6٪89٪8B٪E6٪9C٪BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page= 7&s=162&click=0
الكود العام:
استيراد java.io.ioException ؛ استيراد org.apache.http.httpentity ؛ import org.apache.http.client.clientprotocolexception ؛ import org.apache.http.client.methods.closablehttprespons org.apache.http.impl.client.closablehttpclient ؛ import org.apache.http.impl.client.httpclients ؛ import org.apache.http.util.entityutils ؛ import org.log4j.logger ؛ public getml logger.getLogger (gethtml.class) ؛ السلسلة الثابتة الخاصة Geth (url url) يلقي ClientProtocolexception ، IoException {// Console يخرج سجلات ، بحيث يمكن لكل عنوان URL الوصول إليه رؤية حالة الوصول على log.info ("حل" + url) ؛ / * * المحتوى التالي هو الاستخدام العام لـ httpclient لإنشاء اتصالات * استخدم httpclient لإنشاء عميل * استخدم طريقة GET للوصول إلى عنوان URL المحدد * الحصول على استجابة * */ closlehttpclient client = httpclients.createdefault () ؛ httpget get = new httpget (url) ؛ closablehttpresponse استجابة = client.execute (get) ؛ / * * المحتوى التالي هو تحويل محتوى HTML إلى سلسلة * احصل على جسم الاستجابة * تحويل جسم الاستجابة إلى تنسيق السلسلة ، وهنا يتم استخدام طريقة toString في EntityUtils ، ويتم تعيين تنسيق الترميز على "UTF-8" * إغلاق العميل والرد بعد الانتهاء */ httpentity ictity = response.getentity () ؛ محتوى السلسلة ؛ if (ectity! = null) {content = entityUtils.ToString (untity ، "utf-8") ؛ client.close () ؛ استجابة. close () ؛ إرجاع المحتوى ؛ } آخر عودة لاغية ؛ } urlControl urlControl static static static (string baseurl ، int) يلقي clientprotocolexception ، ioException {// قم بتعيين عدد الصفحات الحالية int = 1 ؛ // إذا كانت الصفحة الحالية أقل من عدد الصفحات التي تريد الزحف ، فستنفذ بينما (count <page) {// عنوان URL الذي تم الوصول إليه بالفعل هو قيمة عنوان URL غير المتغير مع سلسلة قيمة تغيير عنوان URL u = baseurl + (2 * count - 1) + "& click = 0" ؛ // هنا نسمي الطريقة في فئة parsehtml لمعالجة صفحة HTML في عنوان URL ، وسنقدم محتوى سلسلة الفئة = parsehtml.parse (geth (u)). toString () ؛ // هنا نسمي الطريقة في فئة Writeto لكتابة المحتوى المحسّن محليًا. في وقت لاحق ، سوف نقدم class writeto.writeto (content) ؛ count ++ ؛ }}}2.2.2Parsehtml فئة
تتطلب هذه الخطوة عنصر المراجعة لتحديد العلامات التي تحتاج إلى الزحف ، ثم الحصول عليها من خلال محدد CSS في JSoup.
استيراد org.jsoup.jsoup ؛ استيراد org.jsoup.nodes.document ؛ استيراد org.jsoup.nodes.element ؛ استيراد org.jsoup.select.elements ؛ فئة عامة parsehtml مستند المستند = jsoup.parse (المحتوى) ؛ // استخدم SELECT SELECT للاستيلاء على العناصر التي تحتاج إلى العثور عليها. على سبيل المثال ، الاختيار الأول هو المحتوى الذي تساوي سمة الفئة الخاصة به GL-WARP ClearFix في ELE = Doc.Select ("ul [class = gl-warp clearfix]). حدد (" li [class = gl-item] ") ؛ // قم بتعيين حاوية لتثبيت كل سمة StringBuilder SB = New StringBuilder () ؛ // استخدم المحدد السابق للحصول على جميع العناصر التي تلبي المتطلبات في الصفحة بأكملها ، أي كل هاتف. أدناه ، تحتاج إلى اجتياز كل هاتف للحصول على سماته لـ (Element E: ELE) {// يشير اكتساب كل سمة هنا إلى محتوى زحف على مقال على jd.com على الإنترنت. يجب أن يكون هناك أساليب كتابة مختلفة أخرى. معرف السلسلة = e.attr ("بيانات البيانات") ؛ String mingzi = E.Select ("div [class = p-name p-name-type-2]"). حدد ("a"). حدد ("em"). text () ؛ string jiage = e.select ("div [class = p-price]"). حدد ("قوي"). حدد ("i"). text () ؛ String pinglun = e.select ("div [class = p-commit]"). حدد ("قوي"). حدد ("a"). text () ؛ // إضافة سمات sb.append (id+"/t") ؛ sb.append (Mingzi+"/t") ؛ sb.append (jiaage+"/t") ؛ sb.append (pinglun+"/t") ؛ sb.append (pinglun+"/t") ؛ sb.append ("/r/n") ؛ } إرجاع sb ؛ }}2.2.3Writeto فئة
أساليب في هذا الفصل يكتب المحتوى المحسّن في ملف محلي. مجرد io بسيطة.
استيراد java.io.bufferedWriter ؛ استيراد java.io.file ؛ استيراد java.io.filewriter ؛ استيراد java.ioexception ؛ فئة عامة writeto {// قم بتعيين موقع ملف storage الخاص بالملفات الخاص f = new file ("c: //jingdong.txt") ؛ static static void writeTo (محتوى السلسلة) يلقي ioException {// استخدم طريقة الكتابة المستمرة لتجنب الكتابة فوق المحتوى المكتوب مسبقًا bwwwriter bw = new bufferedwriter (new filewriter (f ، true)) ؛ bw.append (المحتوى) ؛ bw.flush () ؛ bw.close () ؛ }}2.2.4MainControl فئة
برنامج التحكم الرئيسي ، اكتب العنوان الأساسي وعدد الصفحات المراد الحصول عليها. استدعاء طريقة urlcontrol في فئة GethTML لزحف الصفحة.
استيراد java.io.ioException ؛ استيراد org.apache.http.client.clientprotocolexception ؛ الطبقة العامة maincontrol {public static void main (string [] args) remrows clientprotocolexception ، ioException {// todo auto-clerated string baseurl = "https://search.jd.com/search؟keyword=٪E6٪89٪8B٪E6٪9C٪BA&enc=" + "Utf-8 & qrst = 1 & rt = 1 & stop = 1 & vt = 2 & cid2 = 653 & cid3 = 655 & page =" ؛ int page = 5 ؛ // قم بتعيين رقم صفحة الزحف gethtml.urlControl (baseurl ، page) ؛ }}3. نتائج الزحف
الزحف 20 صفحة.
3.1 إخراج وحدة التحكم
3.2 إخراج المستند
يمكنك فتحه مباشرة مع Excel ، والمحدد هو حرف TAB. الأعمدة هي رقم المنتج والاسم والسعر وعدد التعليقات على التوالي.
4. ملخص
يستخدم هذا الزحف httpclient و jsoup ، مما يدل على أنه بالنسبة للاحتياجات البسيطة ، لا تزال هذه الأدوات فعالة للغاية. في الواقع ، يمكنك أيضًا كتابة جميع الفصول في فصل واحد ، وفكرة كتابة فصول متعددة أكثر وضوحًا.
المقالة أعلاه Java Crawler تزحف صفحة البحث المحمول httpclient+jsoup على jd.com هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.