Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

この記事のテキストと写真はインターネットからのものであり、学習とコミュニケーションのみを目的としています。商用目的ではありません。ご不明な点がございましたら、お問い合わせください。

次の記事は、著者XiaoXiaomingのCaiJ LearnPythonからのものです。

Pythonクローラー、データ分析、Webサイト開発、その他のケースチュートリアルビデオはオンラインで無料で視聴できます

https://www.xin3721.com/eschool/pythonxin3721/

はじめに
本日、Bytedanceの採用情報をクロールする予定です。
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

開発者ツールを開いて、次のサイトにアクセスします。

https://jobs.bytedance.com/experienced/position?keywords=&category=&location=&project=&type=&job_hot_flag=¤t=1&limit=10
 

この訪問中に監視されるデータはたくさんあり、投稿インターフェイスには必要なjsonデータがあります。
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

応答ヘッダーを観察し、重要なパラメーターcsrfを見つけます。
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、c#チュートリアルのどこに違いがあるを確認します

ByteDanceのウェブサイトにcsrf検証の機能があることを示しており、このcsrfのトークンを取得する方法については後で紹介します。

リクエストパラメータの表示:
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

パラメータパッケージ機能
通常のクロールの便宜のために、上記で必要なパラメータをpythonが認識できる辞書形式に編成する必要があります。コピーして貼り付けるために二重引用符を直接追加する必要がある場所はたくさんありますが、この問題はプログラムで解決できます。

まず、処理関数を定義します。

import re


def warp_heareder(s):
    print("{")
    lines = s.splitlines()
    for i, line in enumerate(lines):
        k, v = line.split(": ")
        if re.search("[a-zA-Z]", k):
            k = f'"{k}"'
        if re.search("[a-zA-Z]", v):
            v = f'"{v}"'
        print(f"    {k}: {v},")
    print("}")

リクエストヘッダーの処理:
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

リクエスト後のデータの処理:

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

ここに写真の説明を挿入

csrfチェック値の取得

まず、Cookieをクリアします。
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

次に、ページを更新して、ネットワーク要求のパケットキャプチャステータスを表示します。
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

検索して検索したところ、ようやくset-cookie応答ヘッダーが見つかりました。この設定cookieパラメーターにはcsrfの設定が含まれています。次に、このインターフェイスをインターフェイスとして使用して、csrfチェック値を取得できます。

セッションを使用して、応答ヘッダーによって設定されたCookieを保存します。

import requests

session = requests.session()
headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'Origin': 'https://jobs.bytedance.com',
    'Referer': f'https://jobs.bytedance.com/experienced/position?keywords=&category=&location=&project=&type=&job_hot_flag=¤t=1&limit=10'
}
data = {
    
    
    "portal_entrance": 1
}
url = "https://jobs.bytedance.com/api/v1/csrf/token"
r = session.post(url, headers=headers, data=data)
r

結果:

<応答[200]>

取得したCookieを表示します。

クッキー= session.cookies.get_dict()
クッキー

結果:

{'atsx-csrf-token': 'RDTEznQqdr3O3h9PjRdWjfkSRW79K_G16g85FrXNxm0%3D'}

明らかに、このトークンは比較的現実的であり、URLエンコードが必要であり、URLデコードが実行されます。

urllib.parseからimportunquote

unquote(cookies ['atsx-csrf-token'])

結果:

'RDTEznQqdr3O3h9PjRdWjfkSRW79K_G16g85FrXNxm0 ='

最初のページのデータのクロールを開始します。
トークンを使用すると、インターフェイスに直接スムーズにアクセスできます。

import requests
import json

headers = {
    
    
    "Accept": "application/json, text/plain, */*",
    "Host": "jobs.bytedance.com",
    "Origin": "https://jobs.bytedance.com",
    "Referer": "https://jobs.bytedance.com/experienced/position?keywords=&category=&location=&project=&type=&job_hot_flag=¤t=1&limit=10",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
    "x-csrf-token": unquote(cookies['atsx-csrf-token']),
}
data = {
    
    
    "job_category_id_list": [],
    "keyword": "",
    "limit": 10,
    "location_code_list": [],
    "offset": 0,
    "portal_entrance": 1,
    "portal_type": 2,
    "recruitment_id_list": [],
    "subject_id_list": []
}
url = "https://jobs.bytedance.com/api/v1/search/job/posts"
r = session.post(url, headers=headers, data=json.dumps(data))
r

結果:

<応答[200]>

応答コードは200で、検証に合格したことを示しています。次に、データ構造を確認します。

r.json()

結果:

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します
ここに写真の説明を挿入

パンダを使用してjsonデータを処理する

import pandas as pd

df = pd.DataFrame(r.json()['data']['job_post_list'])
df.head(3)
 

結果:
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

次に、各列に必要なデータを抽出します。

df.city_info = df.city_info.str['name']
df.recruit_type = df.recruit_type.str['parent'].str['name']
tmp = []
for x in df.job_category.values:
    if x['parent']:
        tmp.append(f"{x['parent']['name']}-{x['name']}")
    else:
        tmp.append(x['name'])
df.job_category = tmp
df.publish_time = df.publish_time.apply(lambda x: pd.Timestamp(x, unit="ms"))
df.head(2)

結果:
ここに写真の説明を挿入

Pythonは大きな工場をクロールして募集データを見つけ、全員の基本的なpythonチュートリアルの違いを確認します

明らかに役に立たない列をさらにいくつか削除します。

df.drop(columns = ['sub_title'、 'job_hot_flag'、 'job_subject']、
inplace = True)df.head()

結果:

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

ByteDanceのすべてのジョブ情報のクロール
上記のテスト基盤を使用して、完全なクロールコードを整理できます。

import requests
from urllib.parse import unquote
import pandas as pd
import time
import os

session = requests.session()
page = 1500
headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'Origin': 'https://jobs.bytedance.com',
    'Referer': f'https://jobs.bytedance.com/experienced/position?keywords=&category=&location=&project=&type=&job_hot_flag=¤t=1&limit={page}'
}
data = {
    
    
    "portal_entrance": 1
}
url = "https://jobs.bytedance.com/api/v1/csrf/token"
r = session.post(url, headers=headers, data=data)
cookies = session.cookies.get_dict()

url = "https://jobs.bytedance.com/api/v1/search/job/posts"
headers["x-csrf-token"] = unquote(cookies["atsx-csrf-token"])
data = {
    
    
    "job_category_id_list": [],
    "keyword": "",
    "limit": page,
    "location_code_list": [],
    "offset": 0,
    "portal_entrance": 1,
    "portal_type": 2,
    "recruitment_id_list": [],
    "subject_id_list": []
}
for i in range(11):
    print(f"准备爬取第{i}页")
    data["offset"] = i*page
    r = None
    whilenot r:
        try:
            r = session.post(url, headers=headers,
                             data=json.dumps(data), timeout=3)
        except Exception as e:
            print("访问超时!等待5s", e)
            time.sleep(5)
    df = pd.DataFrame(r.json()['data']['job_post_list'])
    if df.shape[0] == 0:
        print("爬取完毕!!!")
        break
    df.city_info = df.city_info.str['name']
    df.recruit_type = df.recruit_type.str['parent'].str['name']
    tmp = []
    for x in df.job_category.values:
        if x['parent']:
            tmp.append(f"{x['parent']['name']}-{x['name']}")
        else:
            tmp.append(x['name'])
    df.job_category = tmp
    df.publish_time = df.publish_time.apply(
        lambda x: pd.Timestamp(x, unit="ms"))
    df.drop(columns=['sub_title', 'job_hot_flag', 'job_subject'], inplace=True)
    df.to_csv("bytedance_jobs.csv", mode="a", header=not os.path.exists("bytedance_jobs.csv"), index=False)
    print(",".join(df.title.head(10)))
# 对结果去重
df = pd.read_csv("bytedance_jobs.csv")
df.drop_duplicates(inplace=True)
df.to_csv("bytedance_jobs.csv", index=False)
print("共爬取", df.shape[0], "行无重复数据")

結果:

Pythonは大きな工場をクロールして募集データを見つけ、誰もがどこが違うかを確認します

たった7.3秒で、1W以上のバイトビートでジョブ情報を完成させました。

あなたはそれを読むことができます:

パンダをpdとしてインポートする

df = pd.read_csv(“ bytedance_jobs.csv”)
df

結果:

Pythonは大規模な工場をクロールして募集データを見つけます。vb.netチュートリアルをご覧ください
。全員の違いは何ですか?

10,000以上のジョブ情報があります。

おすすめ

転載: blog.csdn.net/chinaherolts2008/article/details/112862124