Pythonクローラーの実践的な教育、実践的な紹介

I.はじめに

この記事は、以前は初心者のトレーニングに使用されていましたが、誰もが理解しやすいと感じたので、共有してみんなと学びました。Pythonをいくつか学び、それを使って何かをしたいが方向性がない場合は、次のケースを完了してみてください。

古いルールでは、編集者、QQグループ:721195303に注意を払うためにパッケージ化されたソフトウェアが必要です。

2.環境への備え

requests lxml beautifulsoup4 3つのライブラリをインストールします(次のコードはpython3.5環境でのテストに合格しています)

pipインストールリクエストlxmlbeautifulsoup4


image.png

3つ、クローラーのいくつかの小さなケース

  • ローカルパブリックネットワークのIPアドレスを取得する
  • Baidu検索インターフェースを使用してURLコレクターを作成します
  • 捜狗の壁紙を自動的にダウンロード
  • アンケートに自動的に記入する
  • パブリックネットワークプロキシIPを取得し、使用可能か遅延可能かを判断する

3.1ローカルパブリックネットワークのIPアドレスを取得する

言い訳を使用してパブリックネットワーク上のIPをクエリし、Pythonリクエストライブラリを使用してIPアドレスを自動的に取得します。

import requests
r = requests.get("http://2017.ip138.com/ic.asp")
r.encoding = r.apparent_encoding        #使用requests的字符编码智能分析,避免中文乱码
print(r.text)
# 你还可以使用正则匹配re模块提取出IP
import re
print(re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",r.text))


image.png

3.2Baidu検索インターフェースを使用してURLコレクターを作成する

この場合、BeautifulSoupライブラリと組み合わせたリクエストを使用してタスクを完了します。Baidu検索エンジンのクローラー防止メカニズムをバイパスするようにプログラムでUser-Agentヘッダーを設定する必要があります(User-Agentヘッダーなしで試して、データを取得できるかどうかを確認できます)。Baidu検索構造のURLリンクルールに注意してください。たとえば、最初のページのURLリンクパラメータpn = 0、2ページ目のURLリンクパラメータpn = 10などです。ここでは、cssセレクターパスを使用してデータを抽出します。

import requests
from bs4 import BeautifulSoup
# 设置User-Agent头,绕过百度搜索引擎的反爬虫机制
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'}
# 注意观察百度搜索结构的URL链接规律,例如第一页pn=0,第二页pn=10.... 依次类推,下面的for循环搜索前10页结果
for i in range(0,100,10):
        bd_search = "https://www.baidu.com/s?wd=inurl:/dede/login.php?&pn=%s" % str(i)
        r = requests.get(bd_search,headers=headers)
        soup = BeautifulSoup(r.text,"lxml")
    # 下面的select使用了css选择器路径提取数据
        url_list = soup.select(".t > a")
        for url in url_list:
                real_url = url["href"]
                r = requests.get(real_url)
                print(r.url)

プログラムを作成した後、キーワードを使用してinurl:/dede/login.php 、夢の織りのcmsのバックグラウンドアドレスをバッチで抽出します。効果は次のとおりです。


image.png

3.3捜狗の壁紙を自動的にダウンロードする

この例では、検索した壁紙をクローラーから自動的にダウンロードし、プログラムで画像を保存するパスを、画像を保存するディレクトリのパスに変更します。もう1つのポイントは、プログラムでjsonライブラリを使用したことです。これは、観察中に、Sogouの壁紙のアドレスがjson形式で保存されていることがわかったため、jsonを使用してこのデータセットを解析するためです。

import requests
import json
#下载图片
url = "http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E6%B8%B8%E6%88%8F&start=0&len=15&width=1366&height=768"
r = requests.get(url)
data = json.loads(r.text)
for i in data["all_items"]:
    img_url = i["pic_url"]
    # 下面这行里面的路径改成你自己想要存放图片的目录路径即可
    with open("/home/evilk0/Desktop/img/%s" % img_url[-10:]+".jpg","wb") as f:
        r2 = requests.get(img_url)
        f.write(r2.content)
    print("下载完毕:",img_url)


1.gif

3.4アンケートに自動的に記入する

import requests
import random

url = "https://www.wjx.cn/joinnew/processjq.ashx?submittype=1&curID=21581199&t=1521463484600&starttime=2018%2F3%2F19%2020%3A44%3A30&rn=990598061.78751211"
data = {
    "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
    "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
    "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
}

for i in range(0,500):
    choice = (
        random.randint(1, 2),
        random.randint(1, 4),
        random.randint(1, 3),
        random.randint(1, 4),
        random.randint(1, 3),
        random.randint(1, 3),
        random.randint(1, 3),
        random.randint(1, 3),
        random.randint(1, 3),
        random.randint(1, 3),
    )
    data["submitdata"] = data["submitdata"] % choice
    r = requests.post(url = url,headers=header,data=data)
    print(r.text)
    data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"

同じIPを使用して複数のアンケートを送信すると、ターゲットのクローラー防止メカニズムがトリガーされ、確認コードがサーバーに表示されます。


image.png


image.png

X-Forwarded-Forを使用してIPを偽造するために、変更されたコードは次のとおりです。

import requests
import random

url = "https://www.wjx.cn/joinnew/processjq.ashx?submittype=1&curID=21581199&t=1521463484600&starttime=2018%2F3%2F19%2020%3A44%3A30&rn=990598061.78751211"
data = {
    "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
}
header = {
    "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)",
    "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471",
    "X-Forwarded-For" : "%s"
}

for i in range(0,500):
    choice = (
        random.randint(1, 2),
        random.randint(1, 4),
        random.randint(1, 3),
        random.randint(1, 4),
        random.randint(1, 3),
        random.randint(1, 3),
        random.randint(1, 3),
        random.randint(1, 3),
        random.randint(1, 3),
        random.randint(1, 3),
    )
    data["submitdata"] = data["submitdata"] % choice
    header["X-Forwarded-For"] = (str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+str(random.randint(1,255))
    r = requests.post(url = url,headers=header,data=data)
    print(header["X-Forwarded-For"],r.text)
    data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
    header["X-Forwarded-For"] = "%s"

効果画像:


image.png

image.png


image.png

 

この記事については、以前に書いたことがあるので、繰り返しません。

3.5パブリックネットワークプロキシIPを取得し、使用できるかどうかと遅延時間を判断する

この例では、プロキシIPをクロールし、これらのプロキシの実行可能性と遅延を確認します。(クロールされたプロキシIPをプロキシチェーンに追加してから、通常の侵入タスクを実行できます。)ここでは、linuxsystemコマンドを直接呼び出します。

ping -c 1 " + ip.string + " | awk 'NR==2{print}' - 

このプログラムをWindowsで実行する場合os.popenは、最後から3行目のコマンドを変更してWindowsで実行できるようにする必要があります。

from bs4 import BeautifulSoup
import requests
import os

url = "http://www.xicidaili.com/nn/1"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
r = requests.get(url=url,headers=headers)
soup = BeautifulSoup(r.text,"lxml")
server_address = soup.select(".odd > td:nth-of-type(4)")
ip_list = soup.select(".odd > td:nth-of-type(2)")
ports = soup.select(".odd > td:nth-of-type(3)")
for server,ip in zip(server_address,ip_list):
    if len(server.contents) != 1:
        print(server.a.string.ljust(8),ip.string.ljust(20), end='')
    else:
        print("未知".ljust(8), ip.string.ljust(20), end='')
    delay_time = os.popen("ping -c 1 " + ip.string + " | awk 'NR==2{print}' -")
    delay_time = delay_time.read().split("time=")[-1].strip("\r\n")
    print("time = " + delay_time)


image.png

3.gif

4、結論

もちろん、Pythonを使って多くの興味深いことを行うこともできます。上記の例をよく理解していない場合は、最後に一連のPythonクローラー入門チュートリアルを送信します。PythonWebクローラー入門章---私の祖父はそれを理解できます今、インターネットで学ぶことはたくさんありますので、ぜひご活用ください。


自分で作成したPython学習グループ:721195303を引き続きお勧めします。全員がPythonを学習しています。Pythonを学習したい、または学習している場合は、ぜひ参加してください。誰もがソフトウェア開発パーティーであり、時から乾物を共有しています。最新のPythonの高度な資料のコピーと、2021年に私が編集したゼロベースの教育を含む(Pythonソフトウェア開発関連のみ)。高度でPythonに興味のある友人を歓迎します。

おすすめ

転載: blog.csdn.net/aaahtml/article/details/112857514