ホームページ  >  記事  >  バックエンド開発  >  京東書籍をクロールするための Python3 実用クローラーの詳細なグラフィックとテキストの説明

京東書籍をクロールするための Python3 実用クローラーの詳細なグラフィックとテキストの説明

黄舟
黄舟オリジナル
2017-10-09 10:22:372864ブラウズ

私は最近 Python3 を学習しています。次の記事では、主に Python3 の実践的なクローラーの京東書籍の写真に関する関連情報を紹介します。この記事は、皆さんの学習や仕事に役立つ学習価値があります。必要な方は下記をご覧ください。

はじめに

私は最近、仕事で JD.com の書籍の写真をダウンロードする必要があることに遭遇しました。JD.com の書籍と製品のすべての画像をローカル コンピュータにダウンロードすることができます。現時点では、このタイプのクローラはイメージ クローラと呼ばれます。これは非常に大規模なプロジェクトです。

分析の実装

まず、クロールされる最初の Web ページを開きます。この Web ページはクロールの開始ページとして使用されます。 JD.com を開いて書籍カテゴリを選択します。あらゆる種類の書籍が多数あるため、Web サイトは https://list.jd.com/list.html?cat です。 =1713, 3287,3797&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main

図に示すように:

入力すると、合計 251 ページあることがわかります。

それでは、最初のページ以外の他のページを自動的にクロールするにはどうすればよいでしょうか?

「次のページ」をクリックすると、URL の変更を確認できます。次のページをクリックすると、URL が https://list.jd.com/list.html?cat=1713,3287,3797&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main に変わっていることがわかりました。

ここで取得するページはURLで特定される、つまりGETでリクエストされることが分かります。この GET リクエストには複数のフィールドがあり、そのうちの 1 つはページで、対応する値は 2 です。これから、URL 内のキー情報を取得できます。 https://list.jd.com/list.html ? cat=1713,3287,3797&page=2。次に、推測に基づいて page=2 を page=6 に変更したところ、6 ページに正常に入力できることがわかりました。

これから、複数のページを自動的に取得する方法を考えることができます。これは、for ループを使用して実装できます。各ループの後、対応する URL のページ フィールドが 1 ずつ増加します。これは、自動的に に切り替わることを意味します。次のページ。

各ページで、正規表現を使用してソースコード内の画像のリンク部分と一致する対応する画像を抽出し、urllib.request.urlretrieve( を通じて対応するリンクされた画像をローカルに保存する必要があります。 )。

しかし、ここで問題が発生します。この Web ページの写真には、リスト内の製品の写真だけでなく、その隣に無関係な写真も含まれているため、最初の情報フィルタリングを実行できます。中央の製品リスト部分が削除され、データは残り、データの他の部分は除外されます。図に示すように、Web ページのソース コードを右クリックして表示できます。

製品リストの最初の製品名「JAVA from Entry」を使用して、ソース コード内の対応する位置をすばやく見つけることができます。製品リストの特別なロゴについては、その上に「

<p id="plist".+? <p class="page clearfix">

最初の情報フィルタリングの後、残るのは画像リンクです。次のステップは、画像リンク情報に基づいてフィルタリングを行うことです。最初のフィルタリングでは、


この時点で、Web ページ内の対応する画像のソース コードを確認する必要があります。

写真 1:

 <img width="200" height="200" data-img="1" src="//img13.360buyimg.com/n7/jfs/t6130/167/771989293/235186/608d0264/592bf167Naf49f7f6.jpg">

写真 2:


<img width="200" height="200" data-img="1" src="//img10.360buyimg.com/n7/g14/M03/0E/0D/rBEhV1Im1n8IAAAAAAcHltD_3_8AAC0FgC-1WoABweu831.jpg">

2 つの画像コードを比較すると、基本的な形式は同じですが、画像のリンク URL が異なることがわかりました。そこで、この時点で、このルールに基づいて画像リンクを抽出するための正規表現:


<img width="200" height="200" data-img="1" src="//(.+?\.jpg)">

刚开始到这里,我以为就结束了,后来在爬取的过程中我发现每一页都少爬取了很多图片,再次查看源码发现,每页后面的几十张图片又是另一种格式:


<img width="200" height="200" data-img="1" src-img="//img10.360buyimg.com/n7/jfs/t3226/230/618950227/110172/7749a8bc/57bb23ebNfe011bfe.jpg">

所以,完整的正则表达式应该是这两种格式的或:


<img width="200" height="200" data-img="1" src="//(.+?\.jpg)">|

到这里,我们根据该正则表达式,就可以提取出一个页面中所有想要爬取的图片链接。

所以,根据上面的分析,我们可以得到该爬虫的编写思路与过程,具体如下:

  • 建立一个爬取图片的自定义函数,该函数负责爬取一个页面下的我们想爬取的图片,爬取过程为:首先通过urllib.request.utlopen(url).read()读取对应网页的全部源代码,然后根据上面的第一个正则表达式进行第一次信息过滤,过滤完成之后,在第一次过滤结果的基础上,根据上面的第二个正则表达式进行第二次信息过滤,提取出该网页上所有的目标图片的链接,并将这些链接地址存储的一个列表中,随后遍历该列表,分别将对应链接通过urllib.request.urlretrieve(imageurl,filename=imagename)存储到本地,为了避免程序中途异常崩溃,我们可以建立异常处理。

  • 通过for循环将该分类下的所有网页都爬取一遍,链接可以构造为url='https://list.jd.com/list.html?cat=1713,3287,3797&page=' + str(i)

完整的代码如下:


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re
import urllib.request
import urllib.error
import urllib.parse


sum = 0
def craw(url,page):
 html1=urllib.request.urlopen(url).read()
 html1=str(html1)
 pat1=r'<p id="plist".+? <p class="page clearfix">'
 result1=re.compile(pat1).findall(html1)
 result1=result1[0]
 pat2=r'<img width="200" height="200" data-img="1" src="//(.+?\.jpg)">|'
 imagelist=re.compile(pat2).findall(result1)
 x=1
 global sum
 for imageurl in imagelist:
  imagename='./books/'+str(page)+':'+str(x)+'.jpg'
  if imageurl[0]!='':
   imageurl='http://'+imageurl[0]
  else:
   imageurl='http://'+imageurl[1]
  print('开始爬取第%d页第%d张图片'%(page,x))

  try:
   urllib.request.urlretrieve(imageurl,filename=imagename)
  except urllib.error.URLError as e:
   if hasattr(e,'code') or hasattr(e,'reason'):
    x+=1

  print('成功保存第%d页第%d张图片'%(page,x))
  x+=1
  sum+=1

for i in range(1,251):
 url='https://list.jd.com/list.html?cat=1713,3287,3797&page='+str(i)
 craw(url,i)
print('爬取图片结束,成功保存%d张图'%sum)

运行结果如下:

总结

以上が京東書籍をクロールするための Python3 実用クローラーの詳細なグラフィックとテキストの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。