私はクローラーや HTML に触れたことはありませんが、周りにはクローラーがきっかけで Python を学ぶ人がたくさんいます。全体的なアイデアは、偉大な神のブログ:参照ブログ [1]を参照しています。データが承認されているかどうかわからないため、Web サイトの情報は非表示にされており、参考のために方法の実現可能性についてのみ説明されています。間違いがありましたら、みなさんご指摘いただければと思います〜
目次
環境とモジュールの準備
インストールが必要: Python3、Selenium、Chrome ブラウザ、chromedrive
chromedrive のインストール手順については、ブログを参照 [2] を参照してください。バージョンは、インストールされている Chrome ブラウザのバージョンと一致している必要があります。表示方法については、ブログを参照してください [2] 。 3]。
要素の配置
まず、Web サイトのソース コードを観察し、対応する要素のソース コードの場所を見つける必要があります。
Web サイト要素の Selenium の配置方法やその他の基本的な操作については、参照ブログ [4]を参照してください。しかし、実際に運用してみるとなかなか見つけられず、Ning Ningさんに相談したところ、iframeが無視されていたことがわかりました.Webサイトに埋め込まれたWebサイトに相当すると言われています.参照:参考ブログ[5],しかし、非常に幸運なことに、この Web サイトの iframe タグに URL が表示され、それを入力すると要素を見つけることができました。
この URL を入力すると、別の表を含む Web ページであることがわかり、ここで要素を見つけることができます。
この部分で使用される配置方法は、配置にクラス名を使用することです, または xpath を使用することもできます. 要素の配置とデータへのアクセスに使用されるコードは次のとおりです:
biao = browser.find_element_by_class_name("list")
td_content = biao.find_elements_by_tag_name("td")
試してみると、テキストデータが正常に抽出され、リストに保存されます。
ページめくり設定
ページめくりの設定については、次のページ ボタンの位置を特定し、コレクションごとに 1 回クリックし、ループを使用してクリック数を制限するという比較的単純な方法を選択しました。使用したコードは次のとおりです。
key = WebDriverWait(browser, 10).until(
EC.visibility_of_element_located((By.XPATH,'/html/body/div/div[4]/nav/ul/li[8]/a'))
)
key.click()
他の方のコードで、より堅牢に感じられるコードがいくつか追加されています. 時間の制約があるため、この部分は後で追加します. つまり、現時点ではデータのクロールに使用できます。
ファイルに書き込む
データを取得すると一次元のリストデータになるので、numpyでリストの次元を変換してから文字列形式に変換し、最後に'などの余分な文字を取り除いて、スペース区切りのデータに変換し、txtファイルに保存すると、Excelへの取り込みに便利です。使用したコードは次のとおりです。
for td in td_content:
lst.append(td.text)
if(page >= 197):
lst = np.array(lst).reshape(8,5)
else:
lst = np.array(lst).reshape(15,5)
string = str(lst)
string = string.replace('\'\'', '-')
string = string.replace(',', '')
string = string.replace('\'', '')
string = string.replace('[[', ' ')
string = string.replace(']]', ' ')
string = string.replace('[', '')
string = string.replace(']', '')
stringdata = string + '\n'
data_write_txt('data.txt', stringdata)
print('该页已存储')
文字列が大量のメモリを占有しないようにするには、すべてを文字列に入れてから書き込むのではなく、ページがクロールされるたびにファイルに書き込みます。
全体的なコード
import numpy as np
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
browser.get('http://URL')
wait = WebDriverWait(browser, 10)NONE
def get_data(page):
lst = [] #新建空列表
stringdata = '' #新建空字符串
print('正在爬取第:%s/197 页' % page) #显示当前页码
if (page < 197):
key = WebDriverWait(browser, 10).until(
EC.visibility_of_element_located((By.XPATH, '/html/body/div/div[4]/nav/ul/li[8]/a'))
)
#到达197页就不用进行点击了
#定位表格和数据
biao = browser.find_element_by_class_name("list")
td_content = biao.find_elements_by_tag_name("td")
#爬取数据,添加到列表中
for td in td_content:
lst.append(td.text)
if(page >= 197):
lst = np.array(lst).reshape(8,5) #第197页只有8行数据
else:
lst = np.array(lst).reshape(15,5) #前196页有15行数据
string = str(lst) #list转换为字符串格式
#去除标点和多余字符
string = string.replace('\'\'', '-')
string = string.replace(',', '')
string = string.replace('\'', '')
string = string.replace('[[', ' ')
string = string.replace(']]', ' ')
string = string.replace('[', '')
string = string.replace(']', '')
stringdata = string + '\n'
#写入txt文件中,注意是append模式
data_write_txt('data.txt', stringdata)
print('该页已存储')
if (page < 197):
key.click() #点击下一页
def data_write_txt(file_name, datas):
file = open(file_name,'a');
file.write(datas)
file.close();
def main():
for page in range(1,198):
get_data(page)
print("保存文件成功,处理结束")
if __name__ == '__main__':
main()
結果は次のとおりです。
また、2 列目のデータが長すぎると Web ページ内で分岐が発生し、クロール アウトしたときに 1 行しか占有されないという問題もあります。そのようなデータが6つしかないため、Excelをインポートして初めてわかったので、手動で解決しました。他に良い方法があるかどうかわかりません。ここに穴を残して、後で解決する方法を見つけてください。
txt データの Excel へのインポートについては、参照ブログ [6] を参照してください。
参考ブログ
【1】:https://www.cnblogs.com/sanduzxcvbnm/p/10276617.html
【2】:https://blog.csdn.net/qq_38486203/article/details/82852240
【3】:https://jingyan.baidu.com/article/bad08e1ed2d0d709c9512155.html
【4】:https://www.yukunweb.com/2017/7/python-spider-Selenium-PhantomJS-basic/
【5】:https://www.cnblogs.com/alliefu/p/6554773.html
【6】:https://blog.csdn.net/qq_35893120/article/details/90054410