Việc quét dữ liệu từ trang web là một việc cần thiết trong các hoạt động machine learning nói chung và train model nói riêng. Selenium là một công cụ đa năng cung cấp đầy đủ việc quét dữ liệu từ trang web. Việc kết hợp với google colab cho phép bạn quét song song nhiều trang web bằng việc mở nhiều tab google colab mà không ảnh hưởng tới hiệu năng cũng như không cần tới sức mạnh máy tính.
Cài đặt thư viện:
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install selenium
Import thư viện:
from selenium import webdriver
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
import re
options = webdriver.ChromeOptions()
options.add_argument('-headless')
options.add_argument('-no-sandbox')
options.add_argument('-disable-dev-shm-usage')
Chúng ta thử mình quét dữ liệu từ trang web: avito.ru
Dữ liệu thường được tổ chức theo dạng thẻ: trong mỗi thẻ có các feauture cần thiết:
Chúng ta chỉ cần tìm phần tử của thẻ div với class item_table-wrapper:
items = soup.find_all('div', {'class','item_table-wrapper' })
Sau đó, chúng ta tìm metro là phần tử của thẻ span với item-address-georeferences-item__after
metro_dis = item.find('span',{'class','item-address-georeferences-item__after'})
Code full:
def parse_page(search, page):
url = "https://www.avito.ru/moskva?q="+ search+"&p="+ str(page)
wd = webdriver.Chrome('chromedriver',options=options)
wd.get(url)
soup = BeautifulSoup(wd.page_source)
items = soup.find_all('div', {'class','item_table-wrapper' })
df_data = []
for item in items:
metro_dis = item.find('span',{'class','item-address-georeferences-item__after'})
metro_name = item.find('span',{'span','item-address-georeferences-item__content'})
item_name = item.find('a',{'class','snippet-link'}).text
item_price = item.find('span',{'class','snippet-price'}).text
link = item.find('a',{'class','snippet-link'})
urls = re.findall(r'href=[\'"]?([^\'" >]+)', str(link))
urls = ', '.join(urls)
metro_name= metro_name.text if metro_name else None
metro_dis = metro_dis.text if metro_dis else None
data = {'название объявления':item_name,'ссылка на объявление':(str('https://www.avito.ru')+urls),
'цена':item_price.replace('\n ', ''),'метро':metro_name,'расстояние':metro_dis}
df_data.append(data)
dataframe = pd.DataFrame(data=df_data)
return dataframe
df = parse_page('гречка', 4)
Kết quả sẽ hiển thị như bên dưới
Tương tự với những Website khác.