Վեբ սքրեյփինգը Python-ի միջավայրում

Web scraping in python

Կարճ անդրադարձի փորձ, թէ ինչ է վեբ սքրեյփինգը (անգլ. web scraping) – գործիքների համախումբ՝ կայքից տվյալների դուրսբերման համար: Եթե դուք երբևէ առընչվել եք որևէ կայքից ձեզ անհրաժեշտ տվյալների արտահանման անհրաժեշտության խնդրի հետ, ապա այս հոդվածը կսովորեցնի ձեզ ցանկացած կայքից ցանկացած տվյալ դուրս բերել: Ելնելով տենդենցներից, կարելի է ենթադրել, որ վեբ սքրեյթինգը շուտով կդառնա պրոֆեսիոնալ վեբ ծրագրավորողի համար պարտադիր հմտություններից մեկը:

Ինչպե՞ս դուրս բերել անհրաժեշտ տվյալները

Ծանո՞թ իրավիճակ է. ինֆորմացիան արտահանելու կամ հիշելու որևէ միջող կամ հնարավորություն չկա կայքում, բայց այն մեզ ծայրահեղ անհրաժեշտ է:

Առաջին անգամ նման խնդրի հանդիպեցի, երբ հաճախորդներից մեկին անհրաժեշտ էր ցուցակագրել իրենց իսկ հաճախորդների էլ. փոստի հասցեները, սակայն հարթակը, որն օգտագործվում էր, նման գործառույթի հնարավորություն չուներ: Հաճախորդս պատրաստվում էր գտնել ֆրիլանս աշխատող, ով ամենը ձեռքով կտեղափոխեր: Իսկ հասցեներն ավելի քան 8000-ն էին: Բարեբախտաբար, ես ժամանակին հիշեցի վեբ սքրեյթինգի մասին, որն այն ժամանակ դեռ բավականին քիչ ճանաչում ուներ: Մոտ 15 րոպե պահանջվեց ինձնից «ջարդելու» կայքը և խնայելու հաճախորդիս գումարը: Նման խնդիրներ բավականին հաճախ են հանդիպում, այդ իսկ պատճառով էլ կցանկանայի կիսվել փորձով, որը հնարավորություն է տալիս վեբ բրաուզերի միջոցով ցանկացած կայքից դիտարկման համար հասանելի ինֆորմացիան արտահանել:

Վարժության համար կփորձենք Google-ի որոնման արդյունքներից տվյալներ արտահանել: Գուցե օրինակը ոչ այնքան կրեատիվ է, փոխարենը հարմար է մեթոդիկայի հասկացման և յուրացման համար:

Տեխնիկական պահանջներ

  1. Python (օրինակում օգտագործվում է 2.7 վերսիան)
    • Splinter (հիմքում Selenium)
    • Pandas
  2. Chrome բրաուզեր
  3. Chromedriver

Եթե դուք չունեք Pandas և ձանձրանում եք մանրամասն ծանոթանալ վերջինիս, խորհուրդ կտամ Anaconda դիստրիբյուտիվը, որը Python -ի հետ համակցվող կարևոր և օգտակար գրադարաններ ունի:

Ամեն դեպքում, ներբեռնեք ամբողջական տարբերակը, օրինակ pip-ի միջոցով, տերմինալում կամ հրամանների տողում կանչելով

pip install pandas

Եթե դուք չունեք տեղակայված Splinter (և չեք օգտագործում Anaconda), ուղղակի տեղակայեք pip տերմինալի միջոցով.

pip install splinter

Եթե դուք ցանկանում եք Django վիրտուալ միջավայր տեղակայել (որը ևս որոշ առավելություններ ունի), բայց չգիտեք ինչից սկսել, առաջարկում եմ կարդալ Django Framework — Best Practices.

Քայլ 1. Գրադարաններ և բրաուզեր

Նախ և առաջ մենք կներբեռնենք և կկարգավորենք անհրաժեշտ գրադարանները և բրաուզերը: Այսպիսով.

from splinter import Browser
import pandas as pd

# open a browser
browser = Browser('chrome')

Եթե էջը արձագանքում է ձեր գործողություններին, օգտագործեք set_window_size, համոզվելու համար, որ բոլոր ձեզ անհրաժեշտ էլեմենտները երևում են.

# Width, Height
browser.driver.set_window_size(640, 480)

Վերը նշվաշ կոդը կկանչի Chrome բրաուզերը, որից հետո կարող ենք անցնել Google-ի գլխավոր էջ.

browser.visit('https://www.google.com')

Քայլ 2. Կայքի ուսումնասիրություն

Հիանալի է, մենք մուտք ենք գործել որոնման համակարգի գլխավոր էջ: Այս քայլում շեշտը դրված է կայքում վեբ-ինսպեկտորի ( Web Inspector, դեվթուլ, devtool, developer tools) հետ աշխատելու պարզագույն հմտությունների ուսումնասիրության վրա: Առավել փորձառու ծրագրավորողները կարող են անցնել 3-րդ քայլին, իսկ մենք կուսումնասիրենք 2 հիմնական գործառույթ.

  1. Գտնել էլեմենտը HTML էջի մեջ
  2. Գտնված էլեմենտի հետ որոշակի գորշողություններ կատարել

HTML էլեմենտը գտնելու համար մենք կօգտվենք ժամանակակից գրեթե բոլոր բրաուզերների մեջ ներառված վեբ ինսպեկտորից: Մեր դեպքում դա Chrome Web Inspector-ն է: Վերջինիս հասանելություն ունենալու համար բավարար է սեղմել F12 ստեղնին, կամ մկնիկի աջ կլիկով ընտրել բացված մենյուի  Inspect/Просмотреть код կետը, որից հետո կբացվի հատուկ պատուհան (դեֆոլ/լռելյայն այն աջ մասում է լինում): Այնուհետև անհրաժեշտ է սեղմել ինսպեկտորի նշանին՝ ստորև բերված նկարում կարմիր շրջանակի մեջ առնվածը:

webinspector

Այժմ, օգտագործելով կուրսորը կարելի է նշել մեզ անհրաժեշը էլեմենտը: Կուրսորի տեղաշարժի հետ միաժամանակ այն էլեմենտը, որի տիրույթով կանցնի կուրսորը, կընդգծվի ինսպեկտորի հատվածում, իսկ նրա DOM համառոտ հատկանիշները հուշող թուլթիփի միջոցով կտպվի էլեմենտի տիրույթի անկյունում: Սեղմելով անհրաժեշտ էլեմենտի վրա, այն կընտրվի ինսպեկտորի HTML ծառի մեջ: Ստորև բերված  նկարում կարմիր շրջանակի մեջ էլեմենտն է, որի տիրույթում գտնվում է կուրսորը, կապույտ շրջանակի մեջ՝ թուլթիփը, կանաչի մեջ՝ HTML մարքափի (markup) ընդգծումը:

inspector-find

Էլեմենն ընտրելուց հետո մեզ անհրաժեշտ է պատճենել վերջինիս XPath-ը (XML Path Language, XML-ի էլեմենտների դիմելու լեզու, ավելի մանրամասն կանդրադառնանք առանձին հոդվածներով, քանզի սա կարևորագույն և շատ կիրառական հատկություն է), ինչի համար HTML ծառի մեջ էլեմենտի վրա մկնիկի աջ կլիկի օգնությամբ բացված օժանդակ մենյուից ընտրեք «Copy»->«Copy XPath», ինչպես պատկերված ՝ հաջորդ նկարում:

inspector-xpath

Շնորհավորում եմ, քանզի դուք մասամբ արդեն ունեք վիրտուալ թագավորության բանալին: Անցնենք հաջորդ քայլին և սովորենք օգտագործել Splinter-ը, որը հնարավորթուն կտա Python-ի օգնությամբ կառավարել HTML էլեմենտը:

Քայլ 3. Կայքի կառավարում

Հենց նոր մեր ստացած XPath-ը շատ կարևոր ինֆորմացիա է և հետագայում դրա օգտագործումն առավել անվտանգ և հարմար դարձնելու համար, եկեք նախ պահպանենք այն Python-ի փոփոխականի տեսքով.

# I recommend using single quotes
search_bar_xpath = '/html/body/div[1]/div[3]/form/div[2]/div[1]/div[1]/div/div[2]/input

Այժմ փոխանցենք XPath-ը Splinter Browser օբյեկտի հրաշալի մեթոդներից մեկին՝ find_by_xpath(): Այս մեթոդը կհավաքագրի մեր XPath-ին համապատասխանող բոլոր HTML էլեմենտները և կվերադարձնի Element օբյեկտներից բաղկացած ցանկ: Եթե որովող էլեմենտը լինի միակը, ապա կվերադարձվի միաէլեմենտ ցանկ: Կարելի է օգտագործել նաև այլ մեթոդներ, որոնց կիրառությունը կքննարկենք հետագայում (find_by_tag(), find_by_name(), find_by_text() և այլն):

# I recommend using single quotes
search_bar_xpath = '/html/body/div[1]/div[3]/form/div[2]/div[1]/div[1]/div/div[2]/input
# index 0 to select from the list
search_bar = browser.find_by_xpath(search_bar_xpath)[0]

Նշված կոդը հնարավորություն է տալիս տեղորոշել առանձին HTML էլեմենտ, սակայն անհրաժեշտ տվյալներ ստանալու համար մեզ անհրաժեշտ է ևս 2 օգտակար մեթոդի օգնություն՝ fill() և click();

# Now let's set up code to click the search button!
search_bar_xpath = '/html/body/div[1]/div[3]/form/div[2]/div[1]/div[3]/center/input[1]
search_button = browser.find_by_xpath(search_button_xpath)[0]
search_button.click()

Վերը նշված կոդը նախ փնտրում և գտնում է որոնման կոճակը, այնուհետև սեղմում այն:

Համադրելով նկարագրված մեթոդները, կարող ենք անհրաժեշտ որոնողական հարցումը լրացնել և փնտրել այն.

# Now let's set up code to click the search button!
search_bar_xpath = '/html/body/div[1]/div[3]/form/div[2]/div[1]/div[1]/div/div[2]/input
search_bar = browser.find_by_xpath(search_bar_xpath)[0]
search_bar.fill('web scraping')
search_button_xpath = '//*[@id="tsf"]/div[2]/div[3]/center/input[1]' 
search_button = browser.find_by_xpath(search_button_xpath)[0] 
search_button.click()

Քայլ 4. Սքրեյփինգի մեթոդով տվյալների հավաքագրում

Այժմ, երբ որոնումն իրականացել է և մենք տեղափոխվել ենք որոնման արդյունքների էջ, եկեք անցնենք եզրափակիչ գործողությունների և հավաքագրենք մեր որոնման արդյունքների վերնագրերն ու հղումները.

web-scraping-results

Ուշադրություն դարձնենք, որ յուրաքանչյուր արդյունք ներկայացված է div[class=”yuRUbf”]-ի մեջ a թեգով, իսկ վերնագիրը՝ վերջինիս մեջ: Ուստի մեզ անհրաժեշտ՝ վերնագրերի և հղումների հավաքածուները հավաքաբրելու համար մենք կօգտվենք ստորև բերված հրամաններից և նախ կհավաքագրենք բոլոր a թեգերը.

search_results_xpath = '//div[@class="yuRUbf"]/a' # simple, right?

search_results = browser.find_by_xpath(search_results_xpath)

Այս կերպ մենք խնդրեցինք Python-ին որոնել բոլոր a թեգերը, որոնք գտնվում են div[class=”yuRUbf”]-ի մեջ: Այժմ հերթականորեն դուրս բերենք յուրաքանչյուր արդյունքի վերնագիրն ու հղումը.

scraped_data = []
for search_result in search_results:
     title = search_result.text.encode('utf8')  # trust me
     link = search_result["href"]
     scraped_data.append((title, link))  # put in tuples

Տվյալների մաքրումը search_result.text-ի միջոցով երբեմն կարող է իրավացիորեն լարվելու պատճառ հանդիսանալ, հաշվի առնելով, որ ինտերնետումտեքստերի զանազան ձևավորումները: Նման դեպքերում օգնության են հասնում հետևյալ մեթոդները.

.replace()

.encode()

.strip()

Այժմ էջի արդյունքների բոլոր վերնագրերն ու հղումները պահված են scraped_data փոփխականի մեջ: Տվյալների արտահանման համարամենահարմար տարբերակն ըստ իս pandas-ի միջավայրի օգտագործումն է՝ 2 պարզագույն հրամանի միջոցով.

df = pd.DataFrame(data=scraped_data, columns=["Title", "Link"])

df.to_csv("links.csv")

Ներկայացված կոդը ստեղծում ե links.csv ֆայլ, որի մեջ Title և Link սյունյակներին հաջորդում է scraped_data ցուցակի պարունակությունը:

Այսպիսով, մենք հաջողությամբ կարողացանք պատահական էջից արտահանել մեզ անհրաժեշտ ինֆորմացիան: Մեթոդը կիրառելի է ցանկացած այլ նմանատիպ իրավիճակների համար:

 

Սկզբնաղբյուր՝ Mastering Python Web Scraping: Get Your Data Back