Selenium์ ์ฌ์ฉํ ํฌ๋กค๋ง ์ ์(1)
๊ธฐ์กด Selenium์ ์ฌ์ฉํ์ฌ ๋ง๋ค์๋ ํฌ๋กค๋ง์๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ํ๋ ์กด์ฌํ์๋ค.
2022.09.07 - [๊ฐ๋ฐ๐ป/Python] - [Python] Selenium์ ์ฌ์ฉํ ํฌ๋กค๋ง ์ ์(1)
๊ธฐ์กด ํฌ๋กค๋ง์ ๋ฌธ์
๊ธฐ์กด ๋ง๋ค์๋ ํฌ๋กค๋ง์ ์ค๋ณต ์ ๊ฑฐ ๋ก์ง์ด ์กด์ฌํ์ง ์์ ๊ฐ์ ํ์ผ๋ ๊ณ์ ๋ค์ด๋ก๋๋์ด ์ค์ง์ ์ผ๋ก ์ํ๋ ์ ์ฑ APK ํ์ผ์ ๋ค์ด๋ก๋ ํ ์ ์์๊ธฐ์ ์ค๋ณต ์ ๊ฑฐ ๋ก์ง์ ์ถ๊ฐํ๊ธฐ๋ก ํ์๋ค.
์ค๋ณต ์ ๊ฑฐ ๋ก์ง
MD5 ํด์๊ฐ ๋น๊ต๋ฅผ ํตํด ์ค๋ณต ๊ฒ์ฌ๋ฅผ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ฌ List ๋ก ์ ์ธ ํ ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ๊ตฌํํ์๋ค.
ํ์ง๋ง, ๋งค๋ฒ List๊ฐ ์ด๊ธฐํ๋์ด ์ด์ ์ ๋ค์ด๋ก๋ ํ๋ APK์ MD5 ํด์๊ฐ์ด ๋์ ๋๋ ๊ฒ์ด ์๋๋ผ ๊ทธ ์์ (์ฝ๋๋ฅผ ๋๋ฆด ๋)์๋ง ์ค๋ณต์ ๊ฑฐ๊ฐ ์ด๋ฃจ์ด์ก๋ค..๐
๊ทธ๋์ MySQL DB๋ฅผ ์ฌ์ฉํ์ฌ APK์ MD5 ํด์๊ฐ์ ๋์ ํ์ฌ ์ค์นํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๊ณ ๊ตฌํํ์๋ค.
Pymysql - ์ค์น
Python ๋ด MySQL๊ณผ ์ฐ๋๋๋ ๋ชจ๋์ธ pymysql์ ์ฌ์ฉํ์ฌ DB๋ฅผ ๊ตฌ์ถํ์๋ค.
pymysql์ ๊ฐ๋จํ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก ์ค์นํ ์ ์๋ค.
pip install pymysql
Pymysql - DB ์์ฑ
MySQL DB ์์ฑ์ ์ํฌ๋ฒค์น๋ก๋ ๊ฐ๋ฅํ์ง๋ง vscode๋ฅผ ์ฌ์ฉํด๋ ์์ฑ ๊ฐ๋ฅํ๋ค.
์ฒ์์ ์์ ์ MySQL ๊ณผ ์ฐ๊ฒฐํ ํ cursor ๊ฐ์ฒด๋ฅผ ํ๋ ์์ฑํ๋ค.
import pymysql
conn = pymysql.connect(host='localhost', user = 'root', password='๋น๋ฐ๋ฒํธ', charset='utf8')
cursor = conn.cursor()
์ดํ DB ์์ฑ ์ฟผ๋ฆฌ๋ฌธ์ธ "CREATE DATABASE" ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ฌ DB๋ฅผ ์์ฑํ๋ค.
sql = "CREATE DATABASE malware_apk"
ํด๋น ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ์ผ๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๊ณ ์ปค๋ฐ์ ํ์ฌ DB ์์ฑ์ ๋ง๋ฌด๋ฆฌ ํ๋ค.(ํ ์ด๋ธ ์์ฑ๋ ๋์ผํ๊ฒ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๊ณ ์คํํ๋ฉด ๋๋ค.)
sql = "CREATE DATABASE 'DB ๋ช
'"
cursor.execute(sql)
conn.commit()
conn.close()
Pymysql - ๊ตฌํ
ํ ์ด๋ธ ์์ฑ๊น์ง ์๋ฃํ ํ ์ค์ ์ค๋ณต ์ ๊ฑฐ ๋ก์ง์ ๊ตฌํํ์๋ค.
์ฒ์ MySQL๊ณผ ์ฐ๊ฒฐํ๊ณ ๊ธฐ์กด ํด์๊ฐ(SELET '๊ฐ์ ธ์ค๊ณ ์ถ์ ์นผ๋ผ ๋ช ' FROM 'ํ ์ด๋ธ ๋ช ')์ ๋ฆฌ์คํธ์ ๋ฃ์ด ์ด๋ฏธ ๋ค์ด๋ก๋ ํ๋ APK ํ์ผ์ ๋ํด์ ํ์ ํ๋ค.
conn = pymysql.connect(host='localhost', user = 'root', password='๋น๋ฐ๋ฒํธ!',db = 'malware_apk', charset='utf8')
cursor = conn.cursor()
# ๊ธฐ์กด ํด์๊ฐ ๊ฐ์ ธ์ค๊ธฐ
file_hash = []
cursor.execute("SELECT * FROM md5")
for q in cursor.fetchall():
temp = q[1]
file_hash.append(temp)
file_name = []
๊ธฐ์กด ํด์๊ฐ์ ๊ฐ์ ธ์จ ์ดํ Selenium์ Xpath ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ค์ดํ๊ณ ์ ํ๋ APK ํ์ผ์ MD5ํด์๊ฐ์ ๊ฐ์ ธ์จ๋ค.
file_md5 = driver.find_element(By.ID, 'md5_hash')
๋ค์ดํ๊ณ ์ ํ๋ APK ํ์ผ์ MD5 ํด์๊ฐ์ด ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ๋ถ๋ฌ์จ ๋ฆฌ์คํธ์ ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด continue๋ฅผ ํตํด for ๋ฌธ์ ์๋ตํ๊ณ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ค์ด๋ก๋ํ๋ ๋ฃจํด๊น์ง ์งํ๋๋๋ก ๊ตฌํํ์๋ค.
if file_md5.text in file_hash:
print(file_name[h] + "๊ฐ ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.")
continue
file_hash.append(file_md5.text)
sql = "INSERT INTO md5(md5) values(%s)"
val = (file_hash[h])
cursor.execute(sql, val)
# ์ค๋ณต ์๋ ๊ฒฝ์ฐ ๋ค์ด ์งํ
driver.find_element(By.XPATH, '/html/body/main/table/tbody/tr[7]/td/a').click()
์ ์ฒด ์ฝ๋
์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ ๊นํ๋ธ์์๋ ํ์ธํ ์ ์๋ค.
https://github.com/byeongyeolahn/Bazaar_Mobile_malware_crawling
import re
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import unzip
import md5
import pymysql
def crawling():
#my sql ์ฐ๊ฒฐ
conn = pymysql.connect(host='localhost', user = 'root', password='๋น๋ฐ๋ฒํธ',db = 'malware_apk', charset='utf8')
cursor = conn.cursor()
# ๊ธฐ์กด ํด์๊ฐ ๊ฐ์ ธ์ค๊ธฐ
file_hash = []
cursor.execute("SELECT * FROM md5")
for q in cursor.fetchall():
temp = q[1]
file_hash.append(temp)
file_name = []
options = Options()
# ์ต์
์ค์
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
options.add_argument('user-agent=' + user_agent)
options.add_experimental_option("excludeSwitches", ["enable-logging"])
options.add_experimental_option('prefs', {
"download.default_directory": "๋ค์ด๋ก๋ ๋ฐ๊ณ ์ ํ๋ ํด๋ ๊ฒฝ๋ก",
"download.prompt_for_download": False,
"download.directory_upgrade": True,
"safebrowsing.enabled": True})
driver = webdriver.Chrome(options=options)
# ์ด๊ธฐ ๊ฒ์์ด ์
๋ ฅ
query = 'tag:apk'
# URL ์ ์
url1 = 'ํฌ๋กค๋ง ๋์ ์ฌ์ดํธ'
driver.get(url1)
time.sleep(1)
# apk ๊ฒ์ ๊ฒฐ๊ณผ ํ๋ฉด
driver.find_element(By.XPATH, '/html/body/main/div[1]/div/p[2]/a').click()
search_tab = driver.find_element(By.CSS_SELECTOR, '#search')
search_tab.send_keys(query)
search_tab.send_keys(Keys.ENTER)
time.sleep(3)
# apk ํ์ผ๋ค sha256 ๊ฐ ๋ชจ์ผ๊ธฐ
# for i in range(1,4):
for k in range(2,6):
driver.find_element(By.XPATH, '//*[@id="samples_paginate"]/ul/li[{}]/a'.format(k)).click()
for i in range(1,251):
tag_td = driver.find_element(By.CSS_SELECTOR, '#samples > tbody > tr:nth-child({}) > td:nth-child(2) > a'.format(i))
tag_href = tag_td.get_attribute('href')
file_name.append(tag_href)
for h in range(len(file_name)):
url_list = file_name[h]
driver.get(url_list)
# ์ค๋ณต ๊ฒ์ฌ
file_md5 = driver.find_element(By.ID, 'md5_hash')
if file_md5.text in file_hash:
print(file_name[h] + "๊ฐ ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.")
continue
file_hash.append(file_md5.text)
sql = "INSERT INTO md5(md5) values(%s)"
val = (file_hash[h])
cursor.execute(sql, val)
# ์ค๋ณต ์๋ ๊ฒฝ์ฐ ๋ค์ด ์งํ
driver.find_element(By.XPATH, '/html/body/main/table/tbody/tr[7]/td/a').click()
tag_div = driver.find_element(By.CSS_SELECTOR, 'body > main > div.container.text-center')
tag_button = tag_div.find_element(By.TAG_NAME, 'button')
tag_id = tag_button.get_attribute('id')
driver.find_element(By.XPATH, '//*[@id="{}"]'.format(tag_id)).click()
conn.commit()
time.sleep(1)
conn.close()
if __name__ == "__main__":
#๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ
crawling()
*ํด๋น ํฌ๋กค๋ง ๋ด Xpath, Selector์ ์ฌ์ดํธ ๋ด ํน์ ๊ฐ์ผ๋ก ์ฌ์ดํธ๋ง๋ค ๊ฐ์ ๋ชจ๋ ๋ค๋ฅด๋ค.
์ค๋ฅ, ์๋ชป๋ ์ ๋๋ ๊ถ๊ธํ ์ ์ด ์์ผ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์โ
'๊ฐ๋ฐ๐ป > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๊ฐ์ ํ๊ฒฝ ์ฌ์ฉํ๊ธฐ(venv) (0) | 2022.10.05 |
---|---|
[Python] Zipํ์ผ ์์ถ ํด์ (2)(๋น๋ฐ๋ฒํธ ํฌํจ) (0) | 2022.10.04 |
[Python] pymysql ์ ํตํด ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ฐ(Tuple)์ List๋ก ๊ฐ์ ธ์ค๋ ๋ฒ (0) | 2022.09.27 |
[Python] Zipํ์ผ ์์ถ ํด์ (1)(๋น๋ฐ๋ฒํธ ํฌํจ) (0) | 2022.09.17 |
[Python] Selenium ์ฌ์ฉํ๊ธฐ (0) | 2022.09.09 |