นักวิทยาศาสตร์ข้อมูลสามารถใช้ ScRapy บน Python Notebook ได้อย่างง่ายดายได้อย่างไร

เผยแพร่แล้ว: 2020-11-30

สารบัญ

บทนำ

Web-Scraping เป็นหนึ่งในวิธีที่ง่ายและถูกที่สุดในการเข้าถึงข้อมูลจำนวนมากบนอินเทอร์เน็ต เราสามารถสร้างชุดข้อมูลที่มีโครงสร้างได้อย่างง่ายดาย และสามารถใช้ข้อมูลนั้นเพิ่มเติมสำหรับการวิเคราะห์เชิงปริมาณ การคาดการณ์ การวิเคราะห์ความคิดเห็น เป็นต้น วิธีที่ดีที่สุดในการดาวน์โหลดข้อมูลของเว็บไซต์คือการใช้ API ข้อมูลสาธารณะ (เร็วที่สุดและเชื่อถือได้) แต่ไม่ใช่ทั้งหมด เว็บไซต์ให้บริการ API บางครั้ง API ก็ไม่ได้อัปเดตเป็นประจำ และเราอาจพลาดข้อมูลสำคัญไป

ดังนั้นเราจึงสามารถใช้เครื่องมือเช่น Scrapy หรือ Selenium สำหรับการรวบรวมข้อมูลเว็บและการขูดเป็นทางเลือก Scrapy เป็นเฟรมเวิร์กการรวบรวมข้อมูลเว็บแบบโอเพนซอร์ซที่เขียนด้วยภาษา Python ฟรี วิธีที่พบบ่อยที่สุดในการใช้ scrapy คือบนเทอร์มินัล Python และมี บทความ มากมาย ที่สามารถแนะนำคุณตลอดกระบวนการ

แม้ว่ากระบวนการข้างต้นจะได้รับความนิยมอย่างมากในหมู่นักพัฒนา python แต่นักวิทยาศาสตร์ด้านข้อมูลกลับไม่ค่อยเข้าใจ มีวิธีที่ง่ายกว่าแต่ไม่เป็นที่นิยมในการใช้ scrapy ie บนโน้ตบุ๊ก Jupyter เนื่องจากเราทราบดีว่าโน้ตบุ๊ก Python ค่อนข้างใหม่และส่วนใหญ่จะใช้สำหรับการวิเคราะห์ข้อมูล การสร้างฟังก์ชันที่มีปัญหาในเครื่องมือเดียวกันนั้นค่อนข้างง่ายและตรงไปตรงมา

พื้นฐานของแท็ก HTML

การติดตั้ง Scrapy บน Python Notebook

บล็อกโค้ดต่อไปนี้จะติดตั้งและนำเข้าแพ็คเกจที่จำเป็นเพื่อเริ่มต้นใช้งาน Scrapy บนโน้ตบุ๊ก python:

!pip ติดตั้ง scrapy

นำเข้าเศษเหล็ก

จาก scrapy.crawler นำเข้า CrawlerRunner

!pip ติดตั้งโครเชต์

จากการตั้งค่าการนำเข้าโครเชต์

ติดตั้ง()

คำขอนำเข้า

จาก scrapy.http นำเข้า TextResponse

Crawler Runner จะใช้เพื่อเรียกใช้แมงมุมที่เราสร้างขึ้น TextResponse ทำงานเป็นเชลล์สแครชที่สามารถใช้ขูดหนึ่ง URL และตรวจสอบแท็ก HTML สำหรับการดึงข้อมูลจากหน้าเว็บ ในภายหลัง เราสามารถสร้างสไปเดอร์เพื่อทำให้กระบวนการทั้งหมดเป็นแบบอัตโนมัติ และขูดข้อมูลได้มากถึง n จำนวนหน้า

โครเชต์ถูกตั้งค่าเพื่อจัดการกับ ข้อผิดพลาด ReactorNotRestartable ให้เราดูว่าเราสามารถดึงข้อมูลจากหน้าเว็บโดยใช้ ตัวเลือก CSS และ X-path ได้อย่างไร เราจะขูด เว็บไซต์ ข่าว yahoo ด้วยสตริงการค้นหาเป็น tesla ในตัวอย่างนี้ เราจะขูดหน้าเว็บเพื่อรับชื่อบทความ

ตรวจสอบองค์ประกอบเพื่อตรวจสอบแท็ก HTML

คลิกขวาที่ลิงค์แรกและเลือกองค์ประกอบตรวจสอบจะให้ผลลัพธ์ข้างต้นแก่เรา เราจะเห็นได้ว่าชื่อนั้นเป็นส่วนหนึ่งของคลาส <a> เราจะใช้แท็กนี้และพยายามดึงข้อมูลชื่อบนหลาม รหัสด้านล่างจะโหลดเว็บไซต์ Yahoo News ในวัตถุหลาม

r=requests.get(“https://news.search.yahoo.com/search;_ylt=AwrXnCKM_wFfoTAA8HbQtDMD;_ylu=)

X3oDMTEza3NiY3RnBGNvbG8DZ3ExBHBvcwMxBHZ0aWQDBHNlYwNwYWdpbmF0aW9u?p=tesla&nojs=1&ei= UTF-8&b=01&pz=10&bct=0&xargs=0”)

ตอบกลับ = TextResponse(r.url, body=r.text, encoding='utf-8′)

ตัวแปรตอบกลับจะจัดเก็บหน้าเว็บในรูปแบบ html ให้เราลองดึงข้อมูลโดยใช้แท็ก <a> บรรทัดโค้ดด้านล่างใช้ตัวแยก CSS ที่ใช้แท็ก <a> เพื่อแยกชื่อออกจากหน้าเว็บ

response.css('a').extract()

ผลลัพธ์ของตัวเลือก CSS บนตัวแปรตอบกลับ

อย่างที่เราเห็นว่ามีมากกว่ารายละเอียดบทความภายใต้แท็ก <a> ดังนั้นแท็ก <a> จึงไม่สามารถแยกชื่อได้อย่างถูกต้อง วิธีที่ง่ายกว่าและแม่นยำกว่าในการรับแท็กเฉพาะคือการใช้ selector gadget หลังจากติดตั้ง Selector gadget บน chrome แล้ว เราก็สามารถใช้มันเพื่อค้นหาแท็กสำหรับส่วนต่างๆ ของหน้าเว็บที่เราต้องการจะดึงข้อมูล ด้านล่าง เราจะเห็นแท็กที่แนะนำโดย Selector Gadget:

แท็ก HTML ที่แนะนำโดย Selector Gadget

ให้เราลองดึงข้อมูลโดยใช้ตัวเลือก '#web a' โค้ดด้านล่างจะดึงข้อมูลชื่อโดยใช้ตัวแยก CSS

response.css('#web a').extract()

เอาต์พุตหลังจากใช้แท็ก '#web a'

หลังจากใช้แท็กที่แนะนำโดย Gadget Selector เราก็ได้ผลลัพธ์ที่กระชับยิ่งขึ้นโดยใช้แท็กนี้ แต่เราแค่ต้องแยก ชื่อ บทความและแยกข้อมูลอื่นออกจากกัน เราสามารถเพิ่ม ตัวเลือก X-path ได้และทำเช่นเดียวกัน โค้ดด้านล่างจะดึง ข้อความ ชื่อ จากแท็ก CSS:

response.css('#web a').xpath('@title').extract()

รายชื่อชื่อเรื่องทั้งหมด

ดังที่เราเห็นแล้วว่าเราสามารถดึงชื่อบทความจากเว็บไซต์ Yahoo News ได้สำเร็จ แม้ว่าจะเป็นขั้นตอนการลองผิดลองถูกเล็กน้อย แต่เราสามารถเข้าใจโฟลว์กระบวนการเพื่อแก้ไขแท็กและที่อยู่ xpath ที่จำเป็นในการดึงข้อมูลเฉพาะใดๆ จากหน้าเว็บได้อย่างแน่นอน

ในทำนองเดียวกัน เราสามารถแยกลิงก์ คำอธิบาย วันที่ และผู้เผยแพร่ได้โดยใช้องค์ประกอบตรวจสอบและตัวเลือกแกดเจ็ต เป็นกระบวนการที่ต้องทำซ้ำๆ และอาจต้องใช้เวลาสักระยะเพื่อให้ได้ผลลัพธ์ที่ต้องการ เราสามารถใช้ข้อมูลโค้ดนี้เพื่อดึงข้อมูลจากหน้าเว็บข่าวของ yahoo

title = response.css('#web a').xpath(“@title”).extract()

สื่อ = response.css('.cite-co::text').extract()

desc = response.css('ps-desc').extract()

date = response.css('#web .mr-8::text').extract()

ลิงค์ = response.css('h4.s-title a').xpath(“@href”).extract()

อ่าน: อาชีพใน Data Science

การสร้างแมงมุม

ตอนนี้เรารู้วิธีใช้แท็กเพื่อดึงข้อมูลเฉพาะบางส่วนโดยใช้ตัวแปรตอบกลับและตัวแยก css ตอนนี้เราต้องรวมสิ่งนี้กับ Scrapy Spider Scrapy Spiders เป็นคลาสที่มีโครงสร้างที่กำหนดไว้ล่วงหน้าซึ่งสร้างขึ้นเพื่อรวบรวมข้อมูลและขูดข้อมูลจากเว็บไซต์ มีหลายสิ่งที่แมงมุมสามารถควบคุมได้:

  1. ข้อมูลที่จะดึงออกมาจากตัวแปรตอบสนอง
  2. โครงสร้างและการส่งคืนข้อมูล
  3. การล้างข้อมูลหากมีข้อมูลที่ไม่ต้องการในข้อมูลที่ดึงออกมา
  4. ตัวเลือกการขูดเว็บไซต์จนได้เลขหน้าที่กำหนด

ดังนั้นโดยพื้นฐานแล้วแมงมุมจึงเป็นหัวใจของการสร้างฟังก์ชั่นการขูดเว็บโดยใช้ Scrapy เรามาดูทุกส่วนของแมงมุมกันดีกว่า ส่วนหนึ่งของข้อมูลที่จะดึงออกมาได้อธิบายไว้ข้างต้นแล้วว่าเราใช้ตัวแปรตอบกลับเพื่อดึงข้อมูลเฉพาะออกจากหน้าเว็บ

ข้อมูลการทำความสะอาด

บล็อกโค้ดด้านล่างจะล้างข้อมูลคำอธิบาย

TAG_RE = re.compile(r'<[^>]+>') # การลบแท็ก html

เจ = 0

#cleaning คำอธิบาย string

สำหรับฉันในรายละเอียด:

desc[j] = TAG_RE.sub(”, i)

เจ = เจ + 1

รหัสนี้ใช้นิพจน์ทั่วไปและลบแท็ก html ที่ไม่ต้องการออกจากคำอธิบายของบทความ

ก่อน:

<p class=”s-desc”>ในการให้สัมภาษณ์ล่าสุดเกี่ยวกับ Motley Fool Live ผู้ร่วมก่อตั้งและ CEO ของ Motley Fool

Tom Gardner เล่าถึงการพบกับ Kendal Musk — น้องชายของ <b>Tesla</b> (NASDAQ: TSLA)… </p>

หลังจาก Regex:

ในการให้สัมภาษณ์ล่าสุดเกี่ยวกับ Motley Fool Live Tom Gardner ผู้ร่วมก่อตั้งและ CEO ของ Motley Fool เล่าถึงการพบกับ Kendal Musk น้องชายของ Tesla (NASDAQ: TSLA)

ตอนนี้เราจะเห็นแล้วว่าแท็ก html พิเศษจะถูกลบออกจากคำอธิบายบทความ

โครงสร้างและการส่งคืนข้อมูล

# ให้แถวเนื้อหาที่แยกออกมาอย่างชาญฉลาด

สำหรับรายการในไฟล์ zip (ชื่อ, สื่อ, ลิงค์, รายละเอียด, วันที่):

# สร้างพจนานุกรมเพื่อเก็บข้อมูลที่คัดลอกมา

scraped_info = {

'ชื่อ': รายการ[0],

'สื่อ': รายการ [1],

'ลิงค์' : รายการ[2],

'คำอธิบาย' : รายการ[3],

'วันที่' : รายการ[4],

'Search_string' : searchstr,

'ที่มา': “Yahoo News”,

}

# ให้ผลผลิตหรือให้ข้อมูลที่คัดลอกมาเพื่อ scrapy

ให้ผลผลิต scraped_info

ข้อมูลที่ดึงมาจากหน้าเว็บจะถูกเก็บไว้ในตัวแปรรายการต่างๆ เรากำลังสร้างพจนานุกรมซึ่งจะกลับคืนสู่ภายนอกแมงมุม ฟังก์ชัน Yield เป็นฟังก์ชันของสไปเดอร์คลาสใดๆ และใช้เพื่อส่งคืนข้อมูลกลับไปยังฟังก์ชัน ข้อมูลนี้สามารถบันทึกเป็น json, csv หรือชุดข้อมูลประเภทต่างๆ

ต้องอ่าน: เงินเดือนนักวิทยาศาสตร์ข้อมูลในอินเดีย

กำลังนำทางไปยัง n จำนวนหน้า

บล็อกโค้ดด้านล่างใช้ลิงก์เมื่อพยายามไปที่หน้าถัดไปของผลลัพธ์ใน Yahoo News ตัวแปรหมายเลขหน้าจะถูกทำซ้ำจนกว่าจะถึง page_limit และสำหรับหมายเลขหน้าทุกหมายเลข ลิงก์ที่ไม่ซ้ำจะถูกสร้างขึ้นเมื่อใช้ตัวแปรในสตริงลิงก์ คำสั่งต่อไปนี้จะติดตามไปยังหน้าใหม่และให้ข้อมูลจากหน้านั้น

โดยรวมแล้ว เราสามารถไปยังหน้าต่างๆ ได้โดยใช้ไฮเปอร์ลิงก์ฐาน และแก้ไขข้อมูล เช่น หมายเลขหน้าและคำหลัก การแยกไฮเปอร์ลิงก์พื้นฐานสำหรับบางหน้าอาจซับซ้อนเล็กน้อย แต่โดยทั่วไปต้องเข้าใจรูปแบบว่าลิงก์มีการอัปเดตในหน้าถัดไปอย่างไร

เลขหน้า = 1 #เริ่มต้นเลขหน้า

page_limit = 5 #หน้าที่จะคัดลอก

#ติดตามในหน้า URL การเริ่มต้น next_page=”https://news.search.yahoo.com/search;_ylt=AwrXnCKM_wFfoTAA8HbQtDMD;_ylu=

X3oDMTEza3NiY3RnBGNvbG8DZ3ExBHBvcwMxBHZ0aWQDBHNlYwNwYWdpbmF0aW9u?p=”+MySpider.keyword+”&nojs=1&ei=UTF-8&b=”+str(MySpider.pagenumber)=10&”1

ถ้า (MySpider.pagenumber < MySpider.res_limit):

MySpider.pagenumber += 1

ให้ผลตอบสนอง.follow(next_page,callback=self.parse)

#การนำทางไปยังหน้าถัดไป

ฟังก์ชันสุดท้าย

บล็อกโค้ดด้านล่างเป็นฟังก์ชันสุดท้ายเมื่อเรียกจะส่งออกข้อมูลของสตริงการค้นหาในรูปแบบ .csv

def yahoo_news ( searchstr,lim ):

TAG_RE = อีกครั้ง คอมไพล์ (r '<[^>]+>' ) # การลบแท็ก html

คลาส MySpider ( ไปเดอ ร์ .

cnt = 1

ชื่อ = 'yahoonews' #ชื่อแมงมุม

เลขหน้า = 1 #เริ่มต้นเลขหน้า

res_limit = ลิ #หน้าที่จะขูด

คีย์เวิร์ด = searchstr #Search string

start_urls = [ “https://news.search.yahoo.com/search;_ylt=AwrXnCKM_wFfoTAA8HbQtDMD;_ylu=X3oDMTEza3NiY3RnBGNvbG8DZ3ExBHBvcwMxBHZ0aWQDBHNlYwNwF0AWdpbm?

+คีย์เวิร์ด+ “&nojs=1&ei=UTF-8&b=01&pz=10&bct=0&xargs=0” ]

def parse ( self , ตอบกลับ ):

#ข้อมูลที่จะแยกจาก HTML

title = response.css( '#web a' ).xpath( “@title” ).extract()

สื่อ = response.css( '.cite-co::text' ).extract()

desc = response.css( 'ps-desc' ).extract()

date = response.css( '#web .mr-8::text' ).extract()

ลิงค์ = response.css( 'h4.s-title a' ).xpath( “@href” ).extract()

เจ = 0

#cleaning คำอธิบาย string

สำหรับ ฉัน ใน รายละเอียด:

desc[j] = TAG_RE.sub( , ผม)

เจ = เจ + 1

# ให้แถวเนื้อหาที่แยกออกมาอย่างชาญฉลาด

สำหรับ รายการ ใน ไฟล์ zip (ชื่อ, สื่อ, ลิงค์, รายละเอียด, วันที่):

# สร้างพจนานุกรมเพื่อเก็บข้อมูลที่คัดลอกมา

scraped_info = {

'ชื่อ' : รายการ[ 0 ],

'สื่อ' : รายการ[ 1 ],

'ลิงค์' : รายการ[ 2 ],

'คำอธิบาย' : รายการ[ 3 ],

'วันที่' : รายการ[ 4 ],

'Search_string' : searchstr,

'ที่มา' : “ Yahoo News” ,

}

# ให้ผลผลิตหรือให้ข้อมูลที่คัดลอกมาเพื่อ scrapy

ให้ผลผลิต scraped_info

#ติดตามที่ URL การเริ่มต้นใช้งาน

next_page= “https://news.search.yahoo.com/search;_ylt=AwrXnCKM_wFfoTAA8HbQtDMD;_ylu=X3oDMTEza3NiY3RnBGNvbG” \

“8DZ3ExBHBvcwMxBHZ0aWQDBHNlYwNwYWdpbmF0aW9u?p=” +MySpider.keyword+ “&nojs=1&ei=” \

“UTF-8&b=” +str(MySpider.pagenumber)+ “1&pz=10&bct=0&xargs=0”

ถ้า (MySpider.pagenumber < MySpider.res_limit):

MySpider.pagenumber += 1

ตอบกลับ.follow( next_page ,callback= self .parse) #navigation to next page

ถ้า __name__ == “__main__” :

#เริ่มกระบวนการคลาน

รันเนอร์ = CrawlerRunner(การตั้งค่า={

“FEEDS” : { “yahoo_output.csv” : { “format” : “csv” }, #set output ในการตั้งค่า

},

})

d=runner.crawl(MySpider) # สคริปต์จะบล็อกที่นี่จนกว่าการรวบรวมข้อมูลจะเสร็จสิ้น

เราสามารถมองเห็นรหัสต่างๆ ที่รวมอยู่ในการสร้างแมงมุมได้ ส่วนหลักใช้เพื่อเริ่มต้นแมงมุมและกำหนดค่ารูปแบบเอาต์พุต มีการตั้งค่าต่างๆ มากมายที่สามารถแก้ไขได้เกี่ยวกับโปรแกรมรวบรวมข้อมูล สามารถใช้มิดเดิลแวร์หรือพร็อกซีเพื่อกระโดด

runner.crawl(spider) จะดำเนินการกระบวนการทั้งหมด และเราจะได้รับผลลัพธ์เป็นไฟล์ที่คั่นด้วยเครื่องหมายจุลภาค

เอาท์พุต

บทสรุป

ตอนนี้เราสามารถใช้ Scrapy เป็น API บนโน้ตบุ๊ก Python และสร้างสไปเดอร์เพื่อรวบรวมข้อมูลและขูดเว็บไซต์ต่างๆ ได้ นอกจากนี้เรายังมองว่าแท็กและ X-path ต่างๆ สามารถใช้ในการเข้าถึงข้อมูลจากหน้าเว็บได้อย่างไร

เรียนรู้ หลักสูตรวิทยาศาสตร์ข้อมูล จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว

ScRapy คืออะไร?

กรณีการใช้งานจริงของ ScRapy คืออะไร?

ScRapy ใช้เพื่อตัดสินใจเกี่ยวกับจุดราคา บริษัทรวบรวมข้อมูลราคาและข้อมูลจากเว็บไซต์ของคู่แข่งเพื่อช่วยในการตัดสินใจทางธุรกิจที่สำคัญหลายประการ จากนั้นพวกเขาจะบันทึกและวิเคราะห์ข้อมูลทั้งหมด โดยทำการปรับเปลี่ยนราคาที่จำเป็นเพื่อเพิ่มประสิทธิภาพการขายและผลกำไร หลายบริษัทสามารถรับข้อมูลเชิงลึกเกี่ยวกับความต้องการขายตามฤดูกาลได้โดยการรวบรวมข้อมูลจากเว็บไซต์ของคู่แข่ง จากนั้นพวกเขาใช้ข้อมูลเพื่อระบุความต้องการสิ่งอำนวยความสะดวกหรือบุคลากรเพิ่มเติมเพื่อตอบสนองความต้องการที่เพิ่มขึ้น ScRapy ยังใช้สำหรับการสรรหาบริการ รักษาความเป็นผู้นำด้านต้นทุนและโลจิสติกส์ การสร้างไดเรกทอรี และอีคอมเมิร์ซ

ScRapy ทำงานอย่างไร

ScRapy ใช้เวลาและการประมวลผลที่ควบคุมด้วยพัลส์ ซึ่งหมายความว่ากระบวนการร้องขอไม่รอการตอบสนอง แต่จะย้ายไปยังงานถัดไปตามเวลาแทน เมื่อได้รับการตอบกลับ กระบวนการร้องขอจะดำเนินต่อไปเพื่อแก้ไขการตอบกลับ ScRapy สามารถทำงานขนาดใหญ่ได้อย่างง่ายดาย มันสามารถรวบรวมข้อมูลกลุ่มของ URL ในเวลาไม่ถึงนาที ขึ้นอยู่กับขนาดของกลุ่ม และทำได้อย่างรวดเร็วอย่างไม่น่าเชื่อเนื่องจากใช้ Twister สำหรับการขนานกัน ซึ่งทำงานแบบอะซิงโครนัส (ไม่มีการบล็อก)