paint-brush
Bumuo Tayo ng Libreng Web Scraping Tool na Pinagsasama ang mga Proxies at AI para sa Pagsusuri ng Datasa pamamagitan ng@aviatorscode2
262 mga pagbabasa Bagong kasaysayan

Bumuo Tayo ng Libreng Web Scraping Tool na Pinagsasama ang mga Proxies at AI para sa Pagsusuri ng Data

sa pamamagitan ng Victor Yakubu15m2024/12/17
Read on Terminal Reader

Masyadong mahaba; Upang basahin

Matutunan kung paano pagsamahin ang web scraping, mga proxy, at mga modelo ng wikang pinapagana ng AI upang i-automate ang pagkuha ng data at makakuha ng mga naaaksyunan na insight nang walang kahirap-hirap.
featured image - Bumuo Tayo ng Libreng Web Scraping Tool na Pinagsasama ang mga Proxies at AI para sa Pagsusuri ng Data
Victor Yakubu HackerNoon profile picture
0-item
1-item
2-item

Bagama't ang ilang website ay diretsong kiskisan sa pamamagitan lamang ng paggamit ng Selenium, Puppeteer, at mga katulad nito, ang ibang mga website na nagpapatupad ng mga advanced na hakbang sa seguridad gaya ng mga CAPTCHA at IP ban ay maaaring mahirap. Upang malampasan ang mga hamong ito at matiyak na makakapag-scrape ka ng 99% ng mga website nang libre gamit ang Scraper, bubuuin mo ito sa artikulong ito, at isasama mo ang isang tool ng proxy sa iyong code na makakatulong sa pag-bypass sa mga hakbang na ito sa seguridad.


Gayunpaman, ang pagkolekta ng data ay isang hakbang lamang; kung ano ang gagawin mo sa data na iyon ay pantay, kung hindi higit pa, mahalaga. Kadalasan, ito ay nangangailangan ng maingat na pagsasala sa malalaking volume ng impormasyon nang manu-mano. Ngunit paano kung maaari mong i-automate ang prosesong ito? Sa pamamagitan ng paggamit ng language model (LLM), hindi ka lang makakakolekta ng data kundi ma-query mo rin ito para makakuha ng mga makabuluhang insight—makakatipid ng oras at pagsisikap.


Sa gabay na ito, matututunan mo kung paano pagsamahin ang web scraping sa AI upang makabuo ng isang mahusay na tool para sa pagkolekta at pagsusuri ng data nang libre. Sumisid tayo!

Mga kinakailangan

Bago ka magsimula, tiyaking mayroon kang sumusunod:

  1. Pangunahing kaalaman sa Python, dahil ang proyektong ito ay nagsasangkot ng pagsulat at pag-unawa sa Python code.
  2. I-install ang Python (3.7 o mas bago) sa iyong system. Maaari mong i-download ito mula sa python.org .

Pag-install at Pag-setup

Upang magpatuloy sa tutorial na ito, kumpletuhin ang mga sumusunod na hakbang:

Sundin ang mga hakbang na ito upang i-set up ang iyong kapaligiran at maghanda para sa pagbuo ng AI-powered scraper.

1. Gumawa ng Virtual Environment

Una, mag-set up ng isang virtual na kapaligiran upang pamahalaan ang mga dependency ng iyong proyekto. Titiyakin nito na mayroon kang nakahiwalay na espasyo para sa lahat ng kinakailangang pakete.


  1. Lumikha ng bagong direktoryo ng proyekto:

    Buksan ang iyong terminal (o Command Prompt/PowerShell sa Windows) at lumikha ng bagong direktoryo para sa iyong proyekto:

     mkdir ai-website-scraper cd ai-website-scraper


  2. Lumikha ng virtual na kapaligiran:

Patakbuhin ang sumusunod na utos upang lumikha ng virtual na kapaligiran:


  • Sa Windows:

     python -m venv venv
  • Sa macOS/Linux:

     python3 -m venv venv


Lumilikha ito ng venv folder na mag-iimbak ng virtual na kapaligiran.


2. I-activate ang Virtual Environment

I-activate ang virtual na kapaligiran upang magsimulang magtrabaho sa loob nito:


  • Sa Windows:

     .\venv\Scripts\activate
  • Sa macOS/Linux:

     source venv/bin/activate


Ang iyong terminal prompt ay magbabago upang ipakita ( venv ), na nagpapatunay na ikaw ay nasa loob na ngayon ng virtual na kapaligiran.

3. I-install ang Mga Kinakailangang Dependencies

Ngayon, i-install ang mga aklatan na kailangan ng iyong proyekto. Gumawa ng requirements.txt file sa iyong direktoryo ng proyekto at idagdag ang mga sumusunod na dependencies:


 streamlit selenium Beautifulsoup4 langchain langchain-ollama lxml html5lib


Ang mga package na ito ay mahalaga para sa pag-scrape, pagproseso ng data, at pagbuo ng UI:

  • streamlit : Ito ay ginagamit upang lumikha ng interactive na user interface.

  • Selenium : Para sa pag-scrap ng nilalaman ng website.

  • beautifulsoup4 : Para sa pag-parse at paglilinis ng HTML.

  • langchain at langchain-ollama : Ito ay para sa pagsasama sa Ollama LLM at pagproseso ng text.

  • lxml at html5lib : Para sa advanced na pag-parse ng HTML.


I-install ang mga dependencies sa pamamagitan ng pagpapatakbo ng sumusunod na command:

(Tiyaking nasa folder ka kung saan matatagpuan ang file bago patakbuhin ang command.)


 pip install -r requirements.txt


Pagbuo ng UI gamit ang Streamlit

Streamlit ginagawang madali ang paglikha ng interactive na user interface (UI) para sa mga application ng Python. Sa seksyong ito, bubuo ka ng simple, madaling gamitin na interface kung saan maaaring mag-input ang mga user ng URL at ipakita ang na-scrap na data.

1. I-set Up ang Streamlit na Script

Lumikha ng file na pinangalanang ui.py sa iyong direktoryo ng proyekto. Ang script na ito ay tutukuyin ang UI para sa iyong scraper. Gamitin ang code sa ibaba upang buuin ang iyong application:

 import streamlit as st import pathlib from main import scrape_website # function to load css from the assets folder def load_css(file_path): with open(file_path) as f: st.html(f"<style>{f.read()}</style>") # Load the external CSS css_path = pathlib.Path("assets/style.css") if css_path.exists(): load_css(css_path) st.title("AI Scraper") st.markdown( "Enter a website URL to scrape, clean the text content, and display the result in smaller chunks." ) url = st.text_input(label= "", placeholder="Enter the URL of the website you want to scrape") if st.button("Scrape", key="scrape_button"): st.write("scraping the website...") result = scrape_website(url) st.write("Scraping complete.") st.write(result)


  • Ang st.title at st.markdown function ay nagse-set up ng pamagat ng application at nagbibigay ng mga tagubilin para sa mga user.
  • Ang st.text_input component ay nagbibigay-daan sa mga user na ipasok ang URL ng website na gusto nilang i-scrape.
  • Ang pag-click sa button na "Scrape" ay nagti-trigger ng scraping logic, na nagpapakita ng mga progress message gamit ang st.info .


Maaari kang matuto nang higit pa tungkol sa mga streamlit na bahagi mula sa mga ito dokumentasyon .

2. Magdagdag ng Mga Custom na Estilo

Upang lagyan ng istilo ang iyong application, gumawa ng folder ng asset sa direktoryo ng iyong proyekto at magdagdag ng style.css file. I-customize ang Streamlit na interface gamit ang CSS:

 .stAppViewContainer { background-image: url("https://images.unsplash.com/photo-1732979887702-40baea1c1ff6?q=80&w=2832&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"); background-size: cover; color: black; } .stAppHeader { background-color: rgba(0, 0, 0, 0); } .st-ae { background-color: rgba(233, 235, 234, 0.895); } .st-emotion-cache-ysk9xe { color: black; } .st.info, .stAlert { background-color: black; } .st-key-scrape_button button { display: inline-block; padding: 10px 20px; font-size: 16px; color: #fff; background-color: #007bff; border: none; border-radius: 5px; cursor: pointer; animation: pulse 2s infinite; } .st-key-scrape_button button:hover { background-color: #0056b3; color: #fff; }


3. Patakbuhin ang Streamlit app

Sa iyong direktoryo ng proyekto, patakbuhin ang sumusunod na command:

 streamlit run ui.py


Maglulunsad ito ng lokal na server, at dapat kang makakita ng URL sa terminal, kadalasan http://localhost:8501 . Buksan ang URL na ito sa iyong browser upang makipag-ugnayan sa web application.

AI Scraper App

Pag-scrape ng website gamit ang Selenium

Susunod, isulat ang code upang kunin ang HTML na nilalaman ng anumang webpage gamit ang Selenium. Gayunpaman, para gumana ang code, kailangan mo ng Chrome WebDriver.

I-install ang ChromeDriver para sa Selenium

Ang Selenium ay nangangailangan ng isang WebDriver upang makipag-ugnayan sa mga web page. Narito kung paano ito i-set up:

  1. I-download ang ChromeDriver:
    Bisitahin ito Website ng ChromeDriver at i-download ang bersyon na tumutugma sa iyong Google Chrome browser.
  2. Idagdag ang ChromeDriver sa PATH


Pagkatapos i-download ang ChromeDriver, i-extract ang file at kopyahin ang pangalan ng file ng application na " chromedriver " at i-paste ito sa iyong folder ng proyekto.

Kapag tapos na ito, lumikha ng bagong file na tinatawag na main.py at ipatupad ang code sa ibaba:

 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Function to scrape HTML from a website def scrape_website(website_url): # Path to WebDriver webdriver_path = "./chromedriver" # Replace with your WebDriver path service = Service(webdriver_path) driver = webdriver.Chrome(service=service) try: # Open the website driver.get(website_url) # Wait for the page to fully load WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body"))) # Extract the HTML source html_content = driver.page_source return html_content finally: # Ensure the browser is closed after scraping driver.quit()


I-save at patakbuhin ang code; dapat mong makuha ang lahat ng HTML ng pahina na iyong nasimot na ipinapakita sa iyong streamlit na application tulad nito:

Paggamit ng Proxy Provider para I-bypass ang website na may Captcha at IP Bans

Bagama't maaari mo na ngayong kunin ang HTML ng isang website, maaaring hindi gumana ang code sa itaas para sa mga site na may advanced na mga mekanismong anti-scraping gaya ng mga hamon sa CAPTCHA o mga pagbabawal sa IP. Halimbawa, ang pag-scrape ng site tulad ng Indeed o Amazon gamit ang Selenium ay maaaring magresulta sa pag-block ng access sa page ng CAPTCHA. Nangyayari ito dahil nakita ng website na sinusubukan ng isang bot na i-access ang nilalaman nito. Kung magpapatuloy ang pag-uugaling ito, maaaring ipagbawal ng site ang iyong IP address, na pumipigil sa karagdagang pag-access.


Captcha


Upang ayusin ito, pagsamahin Scraping Browser ng Bright Data sa iyong script. Ang scraping browser ay isang mahusay na tool na gumagamit ng maramihang proxy network, kabilang ang mga residential IP, upang i-bypass ang mga anti-scraping defense. Pinangangasiwaan nito ang pag-unblock ng mga pahina sa pamamagitan ng pamamahala ng mga custom na header, fingerprinting ng browser, paglutas ng CAPTCHA, at higit pa. Tinitiyak nito na ang iyong mga pagsusumikap sa pag-scrape ay mananatiling hindi natukoy habang ina-access ang nilalaman nang walang putol.

Pag-set up ng Scraping Browser ng Bright Data nang libre

  1. Pag-sign up — pumunta sa Homepage ng Bright Data at mag-click sa " Simulan ang Libreng Pagsubok ". Kung mayroon ka nang account na may Bright Data, maaari ka lamang mag-log in.

  2. Pagkatapos mag-log in, mag-click sa " Kumuha ng Mga Proxy Products ".


  3. Mag-click sa pindutang " Idagdag " at piliin ang " Scraping Browser ."


  4. Susunod, dadalhin ka sa pahina ng " Magdagdag ng zone ", kung saan kakailanganin mong pumili ng pangalan para sa iyong bagong scraping browser proxy zone. Pagkatapos nito, mag-click sa " Idagdag ".


  5. Pagkatapos nito, malilikha ang iyong mga kredensyal sa proxy zone. Kakailanganin mo ang mga detalyeng ito sa iyong script upang ma-bypass ang anumang mga mekanismong anti-scraping na ginagamit sa anumang website.


Maaari mo ring tingnan ang dokumentasyon ng developer ng Bright Data para sa higit pang mga detalye tungkol sa scraping browser.


Sa iyong main.py file, baguhin ang code dito. Mapapansin mo na ang code na ito ay mas malinis at mas maikli kaysa sa nakaraang code.


 from selenium.webdriver import Remote, ChromeOptions from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection from selenium.webdriver.common.by import By from bs4 import BeautifulSoup AUTH = '<username>:<passord>' SBR_WEBDRIVER = f'https://{AUTH}@brd.superproxy.io:9515' # Function to scrape HTML from a website def scrape_website(website_url): print("Connecting to Scraping Browser...") sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, "goog", "chrome") with Remote(sbr_connection, options=ChromeOptions()) as driver: driver.get(website_url) print("Waiting captcha to solve...") solve_res = driver.execute( "executeCdpCommand", { "cmd": "Captcha.waitForSolve", "params": {"detectTimeout": 10000}, }, ) print("Captcha solve status:", solve_res["value"]["status"]) print("Navigated! Scraping page content...") html = driver.page_source return html


Palitan ang <username> at <password> ng iyong nag-scrap na username at password sa browser.

Nililinis ang nilalaman ng Dom

Pagkatapos i-scrap ang HTML na nilalaman ng isang website, madalas itong puno ng mga hindi kinakailangang elemento gaya ng JavaScript, CSS style, o hindi gustong mga tag na hindi nakakatulong sa pangunahing impormasyon na iyong kinukuha. Upang gawing mas structured at kapaki-pakinabang ang data para sa karagdagang pagpoproseso, kailangan mong linisin ang nilalaman ng DOM sa pamamagitan ng pag-alis ng mga hindi nauugnay na elemento at pag-aayos ng teksto.


Ipinapaliwanag ng seksyong ito kung paano linisin ang nilalamang HTML, i-extract ang makabuluhang teksto, at hatiin ito sa mas maliliit na tipak para sa pagproseso sa ibaba ng agos. Ang proseso ng paglilinis ay mahalaga para sa paghahanda ng data para sa mga gawain tulad ng natural na pagpoproseso ng wika o pagsusuri ng nilalaman.

Code Walkthrough para sa Paglilinis ng Nilalaman ng DOM

Narito ang code na idaragdag sa main.py upang pangasiwaan ang paglilinis ng nilalaman ng DOM:


 from bs4 import BeautifulSoup # Extract the body content from the HTML def extract_body_content(html_content): soup = BeautifulSoup(html_content, "html.parser") body_content = soup.body if body_content: return str(body_content) return "" # Clean the body content by removing scripts, styles, and other unwanted elements def clean_body_content(body_content): soup = BeautifulSoup(body_content, "html.parser") # Remove <script> and <style> tags for script_or_style in soup(["script", "style"]): script_or_style.extract() # Extract cleaned text with each line separated by a newline cleaned_content = soup.get_text(separator="\n") cleaned_content = "\n".join( line.strip() for line in cleaned_content.splitlines() if line.strip() ) return cleaned_content # Split the cleaned content into smaller chunks for processing def split_dom_content(dom_content, max_length=5000): return [ dom_content[i : i + max_length] for i in range(0, len(dom_content), max_length) ]


Ano ang Ginagawa ng Code

  1. Pagkuha ng Nilalaman ng Katawan:
    • Ang extract_body_content function ay gumagamit ng BeautifulSoup upang i-parse ang HTML at i-extract ang nilalaman ng tag na <body> .
    • Kung may tag na <body> , ibabalik ito ng function bilang isang string. Kung hindi, nagbabalik ito ng walang laman na string.
  2. Paglilinis ng Nilalaman:
    • Pinoproseso ng function na clean_body_content ang na-extract na content para alisin ang mga hindi kinakailangang elemento:
      • Ang mga tag na <script> at <style> ay inalis upang alisin ang JavaScript at CSS.
      • Kinukuha ng function ang plain text mula sa nilinis na content.
      • Pino-format nito ang teksto sa pamamagitan ng pagtanggal ng mga walang laman na linya at mga extraneous na espasyo.
  3. Paghahati ng Nilalaman:
    • Kinukuha ng split_dom_content function ang nilinis na content at hinahati ito sa mas maliliit na chunks na may default na maximum na haba na 5,000 character.
    • Ito ay kapaki-pakinabang para sa pagpoproseso ng malalaking halaga ng text sa mga napapamahalaang piraso, lalo na kapag nagpapasa ng data sa mga modelong may mga limitasyon sa laki ng token o input.


I-save ang iyong mga pagbabago at subukan ang iyong application. Dapat kang makakuha ng isang output na tulad nito pagkatapos mag-scrap ng isang website.

Pag-parse ng nilalaman ng Dom sa Ollama

Kapag nalinis at naihanda na ang nilalaman ng DOM, ang susunod na hakbang ay ang pag-parse ng impormasyon upang kunin ang mga partikular na detalye gamit Ollama , isang malaking modelo ng wika (LLM) na isinama sa LangChain. Ang Ollama ay isang CLI tool na ginagamit upang mag-download at magpatakbo ng mga LLM nang lokal. Gayunpaman, bago gamitin ang Ollama, kailangan mong gawin ang mga sumusunod na pag-install:


  • Kung wala ka pa, i-download at i-install ang Ollama mula sa opisyal na website . Maaari mong i-install ito sa Mac gamit ang command na Homebrew.

     brew install ollama
  • Susunod, i-install ang anumang modelo mula sa listahang ito ; may mga modelo tulad ng Phi3, Mistral, Gemma 2, atbp.; bawat isa ay may sariling mga kinakailangan sa system. Ginagamit ng code na ito ang phi3 pangunahin dahil magaan ito.

     ollama pull phi3


Pagkatapos ng pag-install, maaari kang tumawag sa modelong iyon mula sa iyong script gamit ang LangChain upang magbigay ng makabuluhang mga insight mula sa data na ipapadala dito.


Narito kung paano i-set up ang functionality upang i-parse ang nilalaman ng DOM sa modelong phi3

Walkthrough ng code para sa llm.py

Ang sumusunod na code ay nagpapatupad ng lohika upang i-parse ang mga DOM chunks gamit ang Ollama at kunin ang mga nauugnay na detalye:

 from langchain_ollama import OllamaLLM from langchain_core.prompts import ChatPromptTemplate # Template to instruct Ollama for parsing template = ( "You are tasked with extracting specific information from the following text content: {dom_content}. " "Please follow these instructions carefully: \n\n" "1. **Extract Information:** Only extract the information that directly matches the provided description: {parse_description}. " "2. **No Extra Content:** Do not include any additional text, comments, or explanations in your response. " "3. **Empty Response:** If no information matches the description, return an empty string ('')." "4. **Direct Data Only:** Your output should contain only the data that is explicitly requested, with no other text." ) # Initialize the Ollama model model = OllamaLLM(model="phi3") # Function to parse DOM chunks with Ollama def parse_with_ollama(dom_chunks, parse_description): prompt = ChatPromptTemplate.from_template(template) chain = prompt | model parsed_results = [] for i, chunk in enumerate(dom_chunks, start=1): if not chunk.strip(): # Skip empty chunks print(f"Skipping empty chunk at batch {i}") continue try: print(f"Processing chunk {i}: {chunk[:100]}...") # Print a preview print(f"Parse description: {parse_description}") response = chain.invoke( { "dom_content": chunk, "parse_description": parse_description, } ) print(f"Response for batch {i}: {response}") parsed_results.append(response) except Exception as e: print(f"Error parsing chunk {i}: {repr(e)}") parsed_results.append(f"Error: {repr(e)}") return "\n".join(parsed_results)

Ano ang ginagawa ng code.

  1. Template ng Pagtuturo:
    • Nagbibigay ng tumpak na gabay para kay Ollama sa kung anong impormasyon ang kukunin.
    • Tinitiyak na ang output ay malinis, maigsi, at nauugnay sa paglalarawan ng pag-parse.
  2. Pagproseso ng Tipak:
    • Ang parse_with_ollama function ay umuulit sa pamamagitan ng DOM chunks, pinoproseso ang bawat isa gamit ang LLM.
    • Nilalaktawan ang mga walang laman na tipak upang i-optimize ang pagganap.
  3. Error sa Paghawak:
    • Pinangangasiwaan ang mga error nang maganda, ini-log ang mga ito, at patuloy na pinoproseso ang mga natitirang chunks.

Ina-update ang file na ui.py file

Idagdag ang sumusunod na code sa ui.py file upang payagan ang mga user na mag-input ng mga tagubilin sa pag-parse sa LLM at tingnan ang mga resulta:

 from main import scrape_website, extract_body_content, clean_body_content, split_dom_content from llm import parse_with_ollama if "dom_content" in st.session_state: parse_description = st.text_area("Enter a description to extract specific insights from your scraped data:") if st.button("Parse Content", key="parse_button"): if parse_description.strip() and st.session_state.get("dom_content"): st.info("Parsing the content...") dom_chunks = split_dom_content(st.session_state.dom_content) parsed_result = parse_with_ollama(dom_chunks, parse_description) st.text_area("Parsed Results", parsed_result, height=300) else: st.error("Please provide valid DOM content and a description to parse.")

Paano Ito Gumagana sa UI

  1. Input ng User:
    • Nagbibigay ang user ng natural na paglalarawan ng wika ng data na kukunin sa isang text area.
  2. Pag-parse ng Trigger:
    • Kapag na-click ang button na I-parse ang Nilalaman, ang nalinis na nilalaman ng DOM ay nahahati sa mga mapapamahalaang chunks at ipinapasa sa parse_with_ollama.
  3. Display ng mga Resulta:
    • Ang mga na-parse na resulta ay ipinapakita sa isang text area, na nagpapahintulot sa mga user na suriin ang nakuhang impormasyon.


Kapag tapos na ito, makakapagbigay na ang scraper ng mga tugon sa iyong mga senyas batay sa data na nasimot.


Ano ang susunod?

Ang kumbinasyon ng web scraping at AI ay nagbubukas ng mga kapana-panabik na posibilidad para sa mga insight na batay sa data. Higit pa sa pagkolekta at pag-save ng data, maaari mo na ngayong gamitin ang AI upang i-optimize ang proseso ng pagkakaroon ng insight mula sa data na na-scrap. Ito ay kapaki-pakinabang para sa marketing at mga sales team, pagsusuri ng data, mga may-ari ng negosyo, at marami pa.


Makikita mo ang kumpletong code para sa AI scraper dito. Huwag mag-atubiling mag-eksperimento dito at iakma ito sa iyong mga natatanging pangangailangan. Tinatanggap din ang mga kontribusyon—kung mayroon kang mga ideya para sa mga pagpapabuti, isaalang-alang ang paggawa ng pull request!


Maaari mo ring dalhin ito nang higit pa. Narito ang ilang ideya:

  • Eksperimento sa Mga Prompt: Iangkop ang iyong mga prompt upang makakuha ng mga partikular na insight o matugunan ang mga natatanging kinakailangan ng proyekto.
  • User Interface
  • Isama ang iba pang LLM Models: Galugarin ang iba pang mga modelo ng wika tulad ng OpenAI , Gemini , atbp upang higit pang i-optimize ang iyong pagsusuri ng data.