どのようにPythonのクロールサイトのデータとデータの可視化

この記事では、Python、プルフックネットワークデータとデータの可視化をクロールPythonのジョブ関連のデータにプルフックゲートウェイをクロールし、すべての種類のデータの中にクロールは、csvファイルされている説明、その後、csvファイルに関連しますデータフィールドを洗浄し、データの可視化表示、バーグラフ表示を含め、ヒストグラム表示は、友人を参照することができ
序文

バーグラフ表示、ヒストグラムなど、情報およびデータを関連するプルフックPythonの位置データへのゲートウェイをクロールは、種類のCSVファイルが格納されているクロールされており、データフィールド関連付けられたCSVファイルが洗浄され、データの視覚表示図表示、ワードクラウドとを表示するビジュアルデータのさらなる分析のためなど、およびそれらの読者を再生することができ、残りの分析を表示するなど異なる分析とストレージとの多様を含むように拡張。

クロールと関連の依存関係

Pythonのバージョン:Python3.6の
要求:ダウンロードページの
数学:丸いアップ
時間:停止プロセス・
パンダ:データ分析およびCSVファイルとして保存
matplotlibの:描画
pyecharts:描画
statsmodels:統計的モデリング
wordcloud、scipyのダウンロード、jieba:中国語の単語の雲生成
pylab :セットには、中国を示すために描画
の読者は、このような多くのインストールよりもインストールに失敗またはインポートなどの問題が発生したり、自分のBaiduのを使用し、適切なバージョンの依存関係を選択して
、ページの構造解析2を
クロームによっては、「Pythonのエンジニア」チェックで、右クリックを検索しますネットワークがプルフック機構抗爬虫類をしたので、我々は、URLをブラウザの検索バーが変更されていない観察するときやF12、ページのソースコードを表示するチェック機能を使用し、[次へ]をクリックし、位置情報は、ソースコードではなく、 JSONは、我々 JSON直接ダウンロードして、ファイルに保存され、そして私たちが望む関連情報Pythonの仕事を得るために、辞書の方法を使用して直接データを読み込まれます。
ここに画像を挿入説明
Pythonのエンジニアのジョブ情報をクロールするために、次のとおりです。ここに画像を挿入説明
登ることができるようにします我々は、ビューのWebページにシミュレートブラウザにプログラムを使用して、データをしたいので、私 私たちができることを、ヘッダ情報は、当社の我々はリクエストのヘッダを知って、そしてどのような情報が要求されたウェブ解析により、Webページを解析することによって取得され、リクエストがPOSTリクエストで、ヘッダー情報を追加しますクローリングの過程で我々はさらに処理をしたいデータを取得するためのURL要求はここに画像を挿入説明
、次のように情報コードのページがあるクロール:

import requests
 
url = ' https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
 
 
def get_json(url, num):
 """
 从指定的url中通过requests请求携带请求头和请求体获取网页中的信息,
 :return:
 """
 url1 = 'https://www.lagou.com/jobs/list_python%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=&fromSearch=true&suginput='
 headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
  'Host': 'www.lagou.com',
  'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=',
  'X-Anit-Forge-Code': '0',
  'X-Anit-Forge-Token': 'None',
  'X-Requested-With': 'XMLHttpRequest'
 }
 data = {
  'first': 'true',
  'pn': num,
  'kd': 'python工程师'}
 s = requests.Session()
 print('建立session:', s, '\n\n')
 s.get(url=url1, headers=headers, timeout=3)
 cookie = s.cookies
 print('获取cookie:', cookie, '\n\n')
 res = requests.post(url, headers=headers, data=data, cookies=cookie, timeout=3)
 res.raise_for_status()
 res.encoding = 'utf-8'
 page_data = res.json()
 print('请求响应结果:', page_data, '\n\n')
 return page_data
 
 
print(get_json(url, 1))

私たちは、ポストの総数はポストの総数を通じて、JSONで読み取ることができ、ページごとのジョブ数を表示することができます知っているWebページのソースコードを解析することで、ショー最大30、15ページでの求人情報を検索していることを知っている。私たちは、計算することができます総ページ数、その後、クロールページでサイクルを使用し、最終的にポストの要約情報をCSV形式でファイルに書き込まれます。

結果が動作して示されていますここに画像を挿入説明
ように、以下れるすべてのPython関連の仕事情報をクロール:ここに画像を挿入説明
第三には、データストレージクレンジング後
のデータクレンジング、実際に我々は唯一のいくつかの簡単なデータ分析貯蔵後にここにいる作業の大部分を占めることになります。プルフックでネット入力のpython-関連ジョブは18988となります。あなたは、ストレージに置くことがフィールドワークのニーズを選択して、フィールドの一部とさらなるスクリーニングを行い、例えば、我々は、インターンとして郵便局名を削除することができ、ポストフィルタは、当社指定の領域にフィールド領域を指定し、フィールド給与を取ることができます平均的には、最小値とその平均値との間の差の4分の1がオンデマンドでアイテム課金あり

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from wordcloud import WordCloud
from scipy.misc import imread
from imageio import imread
import jieba
from pylab import mpl
 
# 使用matplotlib能够显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 读取数据
df = pd.read_csv('Python_development_engineer.csv', encoding='utf-8')
 
# 进行数据清洗,过滤掉实习岗位
# df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)
# print(df.describe())
 
 
# 由于csv文件中的字符是字符串形式,先用正则表达式将字符串转化为列表,在去区间的均值
pattern = '\d+'
# print(df['工作经验'], '\n\n\n')
# print(df['工作经验'].str.findall(pattern))
df['工作年限'] = df['工作经验'].str.findall(pattern)
print(type(df['工作年限']), '\n\n\n')
avg_work_year = []
count = 0
for i in df['工作年限']:
 # print('每个职位对应的工作年限',i)
 # 如果工作经验为'不限'或'应届毕业生',那么匹配值为空,工作年限为0
 if len(i) == 0:
  avg_work_year.append(0)
  # print('nihao')
  count += 1
 # 如果匹配值为一个数值,那么返回该数值
 elif len(i) == 1:
  # print('hello world')
  avg_work_year.append(int(''.join(i)))
  count += 1
 # 如果匹配为一个区间则取平均值
 else:
  num_list = [int(j) for j in i]
  avg_year = sum(num_list) / 2
  avg_work_year.append(avg_year)
  count += 1
print(count)
df['avg_work_year'] = avg_work_year
# 将字符串转化为列表,薪资取最低值加上区间值得25%,比较贴近现实
df['salary'] = df['薪资'].str.findall(pattern)
#
avg_salary_list = []
for k in df['salary']:
 int_list = [int(n) for n in k]
 avg_salary = int_list[0] + (int_list[1] - int_list[0]) / 4
 avg_salary_list.append(avg_salary)
df['月薪'] = avg_salary_list
# df.to_csv('python.csv', index=False)

第四に、データの可視化・ショーは、
以下では、読者が他のフィールドに表示するために何かをしたい場合は、データの視覚的表示、いくつかの視覚表示の唯一の部分図であり、表示上の異なるビュータイプを使用する場合は、あなた自身の演劇、注:次のコードモジュール導入最後の完全なコードを参照してください

1、周波数が描かれたPythonの給与と保存をヒストグラム
我々はインターネット業界関連の仕事上のpythonエンジニアの給与は一般的にどの範囲の間隔の一部門だった、割合は我々はmatplotlibのライブラリーを助けることができると同じくらいを占めて見たい場合は我々は、ディスプレイのcsvファイルの可視化でデータを保存し、その後、我々はトレンドデータのより直感的な部門を見ることができます

# 绘制python薪资的频率直方图并保存
plt.hist(df['月薪'],bins=8,facecolor='#ff6700',edgecolor='blue') # bins是默认的条形数目
plt.xlabel('薪资(单位/千元)')
plt.ylabel('频数/频率')
plt.title('python薪资直方图')
plt.savefig('python薪资分布.jpg')
plt.show()

結果は次の通りです:ここに画像を挿入説明
2、pythonの関連位置の地理的な円グラフを描く
部門の地理的位置Pythonの位置によって、我々はおおよそのIT産業は主にどの都市部門に集中して理解することができ、私たちは地域の選択の雇用により助長する選択したので、あなたはより多くのインタビューの機会を得ることができ、パラメータは、独自のをデバッグすることができ、または必要に応じて追加しました。

# 绘制饼状图并保存
city = df['城市'].value_counts()
print(type(city))
# print(len(city))
label = city.keys()
print(label)
city_list = []
count = 0
n = 1
distance = []
for i in city:
 
 city_list.append(i)
 print('列表长度', len(city_list))
 count += 1
 if count > 5:
  n += 0.1
  distance.append(n)
 else:
  distance.append(0)
plt.pie(city_list, labels=label, labeldistance=1.2, autopct='%2.1f%%', pctdistance=0.6, shadow=True, explode=distance)
plt.axis('equal') # 使饼图为正圆形
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))
plt.savefig('python地理位置分布图.jpg')
plt.show()

結果は次の通りです:ここに画像を挿入説明
3、描かれたベースpyechart市分布ヒストグラムの
pychartsはPythonのコールBaiduのベースJS開発echartsインタフェースは、データの様々な可視化、より多くのデータの可視化グラフィック表現、参照echartsかもしれである公式サイト:httpsをします。https:公式サイトには、このような折れ線グラフ、棒グラフ、円グラフ、ロードマップ、ツリーなどなどpyechartsに基づく文書は、以下の公式ウェブサイトを参照して、上の私達の参照のための様々な例を、提供してい//www.echartsjs.com/,echarts: //pyecharts.org/#/、Baiduはまた、自分でより多くのネットワークリソースを使用することができます

city = df['城市'].value_counts()
print(type(city))
print(city)
# print(len(city))
 
keys = city.index # 等价于keys = city.keys()
values = city.values
from pyecharts import Bar
 
bar = Bar("python职位的城市分布图")
bar.add("城市", keys, values)
bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render(path='a.html')

結果は以下の通りである:ここに画像を挿入説明
4、Pythonの福祉関連ワードクラウド描く
と呼ばれる単語雲の単語の雲を、同じ雲のような上の著名な視覚的なフォーム「キーワードレンダリング」のように見えるテキストデータ中のキーワードの高い周波数でありますテキスト情報の多くをフィルタリングするには、カラー写真、,, 1は、式のテキストデータの主な意味を楽しむことができる人。使用jiebaの単語と単語WorldCloud(カスタマイズ可能な背景を)生成し、クラウド、以下は、福祉関連の仕事パイソンは、表示の単語の雲を作っているほとんどの企業の利益を見るために、より直感的にすることができ福祉#を描画するには分野に注力します単語の雲治療

text = ''
for line in df['公司福利']:
 if len(eval(line)) == 0:
  continue
 else:
  for word in eval(line):
   # print(word)
   text += word
 
cut_word = ','.join(jieba.cut(text))
word_background = imread('公主.jpg')
cloud = WordCloud(
 font_path=r'C:\Windows\Fonts\simfang.ttf',
 background_color='black',
 mask=word_background,
 max_words=500,
 max_font_size=100,
 width=400,
 height=800
 
)
word_cloud = cloud.generate(cut_word)
word_cloud.to_file('福利待遇词云.png')
plt.imshow(word_cloud)
plt.axis('off')
plt.show()

結果は次の通りです:
ここに画像を挿入説明
第五に、爬虫類と完全なコードの可視化
次のコードでは、完全なコード、興味のあるジュニアパートナーは試してみてコメント欄で行うことができるように実行するか、モジュールのインストールに失敗として、使用する場所を理解するために行くためにテストを適切に実行することができますコメントは、私たちはそれを解決しましょう

あなたは、再生する賞賛ああ、元のコンテンツを指す助けることができると思う場合は、ソースを示しています!

1、完全なコードを爬虫類

当社のウェブサイトを頻繁に要求が制限されているIPを防ぐために、我々はもちろん、あなたも、このような自己実現剤などの他の手段を使用することができ、各ページのクロール時間の経過後にスリープ状態に選びました

import requests
import math
import time
import pandas as pd
 
 
def get_json(url, num):
 """
 从指定的url中通过requests请求携带请求头和请求体获取网页中的信息,
 :return:
 """
 url1 = 'https://www.lagou.com/jobs/list_python%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=&fromSearch=true&suginput='
 headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
  'Host': 'www.lagou.com',
  'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=',
  'X-Anit-Forge-Code': '0',
  'X-Anit-Forge-Token': 'None',
  'X-Requested-With': 'XMLHttpRequest'
 }
 data = {
  'first': 'true',
  'pn': num,
  'kd': 'python工程师'}
 s = requests.Session()
 print('建立session:', s, '\n\n')
 s.get(url=url1, headers=headers, timeout=3)
 cookie = s.cookies
 print('获取cookie:', cookie, '\n\n')
 res = requests.post(url, headers=headers, data=data, cookies=cookie, timeout=3)
 res.raise_for_status()
 res.encoding = 'utf-8'
 page_data = res.json()
 print('请求响应结果:', page_data, '\n\n')
 return page_data
 
 
def get_page_num(count):
 """
 计算要抓取的页数,通过在拉勾网输入关键字信息,可以发现最多显示30页信息,每页最多显示15个职位信息
 :return:
 """
 page_num = math.ceil(count / 15)
 if page_num > 30:
  return 30
 else:
  return page_num
 
 
def get_page_info(jobs_list):
 """
 获取职位
 :param jobs_list:
 :return:
 """
 page_info_list = []
 for i in jobs_list: # 循环每一页所有职位信息
  job_info = []
  job_info.append(i['companyFullName'])
  job_info.append(i['companyShortName'])
  job_info.append(i['companySize'])
  job_info.append(i['financeStage'])
  job_info.append(i['district'])
  job_info.append(i['positionName'])
  job_info.append(i['workYear'])
  job_info.append(i['education'])
  job_info.append(i['salary'])
  job_info.append(i['positionAdvantage'])
  job_info.append(i['industryField'])
  job_info.append(i['firstType'])
  job_info.append(i['companyLabelList'])
  job_info.append(i['secondType'])
  job_info.append(i['city'])
  page_info_list.append(job_info)
 return page_info_list
 
 
def main():
 url = ' https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
 first_page = get_json(url, 1)
 total_page_count = first_page['content']['positionResult']['totalCount']
 num = get_page_num(total_page_count)
 total_info = []
 time.sleep(10)
 print("python开发相关职位总数:{},总页数为:{}".format(total_page_count, num))
 for num in range(1, num + 1):
  # 获取每一页的职位相关的信息
  page_data = get_json(url, num) # 获取响应json
  jobs_list = page_data['content']['positionResult']['result'] # 获取每页的所有python相关的职位信息
  page_info = get_page_info(jobs_list)
  print("每一页python相关的职位信息:%s" % page_info, '\n\n')
  total_info += page_info
  print('已经爬取到第{}页,职位总数为{}'.format(num, len(total_info)))
  time.sleep(20)
  # 将总数据转化为data frame再输出,然后在写入到csv各式的文件中
  df = pd.DataFrame(data=total_info,
       columns=['公司全名', '公司简称', '公司规模', '融资阶段', '区域', '职位名称', '工作经验', '学历要求', '薪资', '职位福利', '经营范围',
         '职位类型', '公司福利', '第二职位类型', '城市'])
  # df.to_csv('Python_development_engineer.csv', index=False)
  print('python相关职位信息已保存')
 
 
if __name__ == '__main__':
 main()

2、完全なコードの可視化

データ可視化matplotlibの、jieba、wordcloud、pyecharts、pylab、モジュールなどscipyのダウンロードの使用を含む、読者は、個々のモジュール自体の使用を理解し、かつ様々なパラメータに関連することができます

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from wordcloud import WordCloud
from scipy.misc import imread
# from imageio import imread
import jieba
from pylab import mpl
 
# 使用matplotlib能够显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 读取数据
df = pd.read_csv('Python_development_engineer.csv', encoding='utf-8')
 
# 进行数据清洗,过滤掉实习岗位
# df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)
# print(df.describe())
 
 
# 由于csv文件中的字符是字符串形式,先用正则表达式将字符串转化为列表,在去区间的均值
pattern = '\d+'
# print(df['工作经验'], '\n\n\n')
# print(df['工作经验'].str.findall(pattern))
df['工作年限'] = df['工作经验'].str.findall(pattern)
print(type(df['工作年限']), '\n\n\n')
avg_work_year = []
count = 0
for i in df['工作年限']:
 # print('每个职位对应的工作年限',i)
 # 如果工作经验为'不限'或'应届毕业生',那么匹配值为空,工作年限为0
 if len(i) == 0:
  avg_work_year.append(0)
  # print('nihao')
  count += 1
 # 如果匹配值为一个数值,那么返回该数值
 elif len(i) == 1:
  # print('hello world')
  avg_work_year.append(int(''.join(i)))
  count += 1
 # 如果匹配为一个区间则取平均值
 else:
  num_list = [int(j) for j in i]
  avg_year = sum(num_list) / 2
  avg_work_year.append(avg_year)
  count += 1
print(count)
df['avg_work_year'] = avg_work_year
# 将字符串转化为列表,薪资取最低值加上区间值得25%,比较贴近现实
df['salary'] = df['薪资'].str.findall(pattern)
#
avg_salary_list = []
for k in df['salary']:
 int_list = [int(n) for n in k]
 avg_salary = int_list[0] + (int_list[1] - int_list[0]) / 4
 avg_salary_list.append(avg_salary)
df['月薪'] = avg_salary_list
# df.to_csv('python.csv', index=False)
 
 
"""1、绘制python薪资的频率直方图并保存"""
plt.hist(df['月薪'], bins=8, facecolor='#ff6700', edgecolor='blue') # bins是默认的条形数目
plt.xlabel('薪资(单位/千元)')
plt.ylabel('频数/频率')
plt.title('python薪资直方图')
plt.savefig('python薪资分布.jpg')
plt.show()
 
"""2、绘制饼状图并保存"""
city = df['城市'].value_counts()
print(type(city))
# print(len(city))
label = city.keys()
print(label)
city_list = []
count = 0
n = 1
distance = []
for i in city:
 
 city_list.append(i)
 print('列表长度', len(city_list))
 count += 1
 if count > 5:
  n += 0.1
  distance.append(n)
 else:
  distance.append(0)
plt.pie(city_list, labels=label, labeldistance=1.2, autopct='%2.1f%%', pctdistance=0.6, shadow=True, explode=distance)
plt.axis('equal') # 使饼图为正圆形
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))
plt.savefig('python地理位置分布图.jpg')
plt.show()
 
"""3、绘制福利待遇的词云"""
text = ''
for line in df['公司福利']:
 if len(eval(line)) == 0:
  continue
 else:
  for word in eval(line):
   # print(word)
   text += word
 
cut_word = ','.join(jieba.cut(text))
word_background = imread('公主.jpg')
cloud = WordCloud(
 font_path=r'C:\Windows\Fonts\simfang.ttf',
 background_color='black',
 mask=word_background,
 max_words=500,
 max_font_size=100,
 width=400,
 height=800
 
)
word_cloud = cloud.generate(cut_word)
word_cloud.to_file('福利待遇词云.png')
plt.imshow(word_cloud)
plt.axis('off')
plt.show()
 
"""4、基于pyechart的柱状图"""
city = df['城市'].value_counts()
print(type(city))
print(city)
# print(len(city))
 
keys = city.index # 等价于keys = city.keys()
values = city.values
from pyecharts import Bar
 
bar = Bar("python职位的城市分布图")
bar.add("城市", keys, values)
bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render(path='a.html')

913066266、高齢者が学んでいる方法を見て:私たちは、Pythonのバックルqunを学ぶお勧めします!基本的なWeb開発Pythonスクリプトからなど、爬虫類、ジャンゴ、データマイニング、へ[PDF、実際のソースコード]、ゼロベースのプロジェクトの戦闘データに仕上げています。どんな小さなPythonのパートナーに与えられました!毎日、ダニエルは、いくつかの学習方法と細部への注意を払う必要性を共有するために、タイミングPythonの技術を説明しましょうクリックたちの学習のPythonの収集が
よりこの記事の内容全体よりも、我々は助け学習したいです

公開された46元の記事 ウォン称賛30 ビュー70000 +

おすすめ

転載: blog.csdn.net/haoxun09/article/details/104828417