104學習精靈

資料擷取

資料擷取
關注
邀請朋友
邀請朋友

Line

Facebook

Twitter

複製連結

取消
關於教室
關注人數 0 人
104人力銀行從職缺中挑選出常見技能所成立的官方教室,提供大家進行共學互動。
學習主持人
持續分享知識,
有機會成為官方教室主持人
教室標籤
關於教室
關注人數 0 人
104人力銀行從職缺中挑選出常見技能所成立的官方教室,提供大家進行共學互動。
學習主持人
持續分享知識,
有機會成為官方教室主持人
教室標籤
Hi~ 歡迎分享學習資源,有學習問題可匿名向Giver發問!
我要分享
我要提問

資料擷取 學習推薦

全部
影片
文章
Mike Ku

Learn Code With Mike品牌創辦人

01/21 22:53

不可不知的Scrapy框架爬取下一層網頁資料實作
本文以INSIDE硬塞的網路趨勢觀察網站( https://www.inside.com.tw/ )首頁的熱門文章為例,來和大家分享如何在Scrapy框架中爬取下一層的網頁內容。
Q: Scrapy網頁爬蟲爬取下一層網頁內容
建立Scrapy網頁爬蟲檔案(hot_news.py),在parse()方法(Method)的地方,透過Scrapy框架的xpath()方法(Method),來爬取INSIDE硬塞的網路趨勢觀察網站的所有熱門文章下一層網頁網址,如下範例:
import scrapy
class HotNewsSpider(scrapy.Spider):
name = 'hot_news'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
post_urls = response.xpath(
"//a[@class='hero_menu_link']/@href").getall()
詳細的Scrapy xpath定位元素方法教學可以參考[Scrapy教學5]掌握Scrapy框架重要的XPath定位元素方法文章( https://www.learncodewithmike.com/2021/01/scrapy-xpath-selectors.html )。取得了所有熱門文章的下一層網頁網址後,就可以透過迴圈來進行請求,如下範例:
import scrapy
class HotNewsSpider(scrapy.Spider):
name = 'hot_news'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
post_urls = response.xpath(
"//a[@class='hero_menu_link']/@href").getall()
for post_url in post_urls:
yield scrapy.Request(post_url, self.parse_content)
其中Request方法(Method)的第一個參數,就是「請求網址」,也就是熱門文章的下一層網頁網址,而第二個參數就是請求該網址後,所要執行的方法(Method),而parse_content()方法(Method)中,就是來爬取熱門文章的下一層網頁內容,以本文為例就是包含「文章標題」及「文章摘要」。
接著,就可以在parse_content()方法(Method)中,同樣使用Scrapy框架的xpath()方法(Method),來爬取「文章標題」及「文章摘要」,如下範例:
import scrapy
class HotNewsSpider(scrapy.Spider):
...
def parse_content(self, response):
# 熱門文章標題
hot_news_title = response.xpath(
"//h1[@class='post_header_title js-auto_break_title']/text()").get()
# 熱門文章摘要
hot_news_intro = response.xpath(
"//div[@class='post_introduction']/text()").get()
print(f"熱門文章標題:{hot_news_title},\n熱門文章摘要:{hot_news_intro}")
利用以下的指令執行Scrapy網頁爬蟲:
$ scrapy crawl hot_news
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2021/02/scrapy-follow-links-and-collect-data.html
)網站觀看更多精彩內容。
拍手 2 留言 0 觀看 367 收藏 0
Mike Ku

Learn Code With Mike品牌創辦人

01/19 22:57

一定要懂的Scrapy框架結合Gmail寄送爬取資料附件秘訣
本文將爬取的結果存入CSV檔案後,透過Gmail附件郵寄給使用者。在開始之前,大家可以先參考[Python實戰應用]Python寄送Gmail電子郵件實作教學文章( https://www.learncodewithmike.com/2020/02/python-email.html )的第二節步驟,取得Gmail的應用程式密碼,以便能夠利用它的SMTP(簡易郵件傳輸協定)來發送郵件。
Q: Scrapy MailSender結合Gmail發送郵件
在Scrapy網頁爬蟲框架中,想要實作發送電子郵件的功能,可以使用內建的MailSender模組(Module),透過基本的設定即可達成。開啟Scrapy專案的settings.py設定檔,加入以下的Gmail SMTP設定:
MAIL_HOST = "smtp.gmail.com"
MAIL_PORT = 587
MAIL_FROM = "申請Gmail應用程式密碼所使用的電子郵件帳號"
MAIL_PASS = "Gmail應用程式密碼"
MAIL_TLS = True
並且,將[Scrapy教學7]教你Scrapy框架匯出CSV檔案方法提升資料處理效率文章( https://www.learncodewithmike.com/2021/01/scrapy-export-csv-files.html )中所建立的CsvPipeline資料模型管道設定開啟,如下範例:
ITEM_PIPELINES = {
'news_scraper.pipelines.CsvPipeline': 500,
}
設定完成後,開啟ITEM PIPELINE資料模型管道(pipelines.py)檔案,引用Scrapy框架的設定檔及MailSender模組(Module),如下範例:
from itemadapter import ItemAdapter
from news_scraper import settings
from scrapy.mail import MailSender
接著,在CsvPipeline類別(Class)的close_spider()方法(Method)中,來建立Scrapy MailSender物件,以及指定Gmail的附件,包含「附件顯示的名稱(attach_name)」、「網際網路媒體類型(mime_type)」及「檔案物件(file_object)」,如下範例:
class CsvPipeline:
...
def close_spider(self, spider):
self.exporter.finish_exporting()
self.file.close()
mail = MailSender(smtphost=settings.MAIL_HOST,
smtpport=settings.MAIL_PORT,
smtpuser=settings.MAIL_FROM,
smtppass=settings.MAIL_PASS,
smtptls=settings.MAIL_TLS)
attach_name = "posts.csv"
mime_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
file_object = open("posts.csv", "rb")
return mail.send(to=["example@gmail.com"],
subject="news",
body="",
attachs=[(attach_name, mime_type, file_object)])
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2021/02/scrapy-sending-gmail.html
)網站觀看更多精彩內容。
拍手 2 留言 0 觀看 96 收藏 0
Mike Ku

Learn Code With Mike品牌創辦人

01/19 22:07

詳解Scrapy框架爬取分頁資料的實用技巧(下)
Q: Scrapy爬取多頁的網頁內容
在定位到INSIDE硬塞的網路趨勢觀察網站-AI新聞( https://www.inside.com.tw/tag/ai )的「下一頁」按鈕後,接下來就要判斷這個按鈕是否存在,如果存在的話代表後續還有分頁,需要繼續往下爬取,反之,則停止,如下範例:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
yield from self.scrape(response) #爬取網頁內容
# 定位「下一頁」按鈕元素
next_page_url = response.xpath(
"//a[@class='pagination_item pagination_item-next']/@href")
if next_page_url:
url = next_page_url.get() #取得下一頁的網址
yield scrapy.Request(url, callback=self.parse) #發送請求
def scrape(self, response):
...
其中,callback關鍵字參數(Keyword Argument)代表的意思,就是在Scrapy網頁爬蟲請求下一頁的網址後,再重新執行parse()方法(Method),也就會取得下一頁的回應結果(response),爬取網頁內容,並且定位「下一頁」按鈕,判斷如果存在的話,代表還有下一頁,則取得下一頁的網址,發送請求,以此類推,直到沒有下一頁為止。
以上就是將INSIDE硬塞的網路趨勢觀察網站-AI新聞的所有分頁資料爬取下來的實作方法。當然,有時候並不想爬取那麼多的資料,可能只需要特定頁數的內容,舉例來說前3頁,就可以在每一次請求下一頁的網址前,將執行次數(count)加1,判斷如果在3次內,就發送請求,否則停止,如下範例:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
count = 1 # 執行次數
def parse(self, response):
yield from self.scrape(response) #爬取網頁內容
# 定位「下一頁」按鈕元素
next_page_url = response.xpath(
"//a[@class='pagination_item pagination_item-next']/@href")
if next_page_url:
url = next_page_url.get() #取得下一頁的網址
InsideSpider.count += 1
if InsideSpider.count <= 3:
yield scrapy.Request(url, callback=self.parse) #發送請求
def scrape(self, response):
...
最後,利用以下指令來執行Scrapy網頁爬蟲:
$ scrapy crawl inside
以上就是爬取INSIDE硬塞的網路趨勢觀察網站-AI新聞的前3頁內容,讀者可依自己的需求來進行頁數的調整。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2021/02/scraping-multiple-pages-with-scrapy.html
)網站觀看更多精彩內容。
拍手 1 留言 0 觀看 74 收藏 0
Mike Ku

Learn Code With Mike品牌創辦人

01/18 22:53

詳解Scrapy框架爬取分頁資料的實用技巧(上)
Q: Scrapy專案建立網頁內容爬取方法(Method)
首先,為了提升Scrapy網頁爬蟲(spiders/inside.py)的parse()方法(Method)爬取邏輯的重用性,本文將它獨立成一個新方法(Method),如下範例:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
yield from self.scrape(response) #爬取網頁內容
def scrape(self, response):
# 爬取文章標題
post_titles = response.xpath(
"//h3[@class='post_title']/a[@class='js-auto_break_title']/text()"
).getall()
# 爬取發佈日期
post_dates = response.xpath(
"//li[@class='post_date']/span/text()"
).getall()
# 爬取作者
post_authors = response.xpath(
"//span[@class='post_author']/a/text()"
).getall()
for data in zip(post_titles, post_dates, post_authors):
NewsScraperItem = {
"post_title": data[0],
"post_date": data[1],
"post_author": data[2]
}
yield NewsScraperItem
由於爬取邏輯被獨立為一個新方法(Method),這時候在parse()方法(Method)中,則需使用「yield from」關鍵字來進行呼叫,並且傳入網頁的回應結果(response),來執行網頁資料的爬取。
Q: Scrapy定位網頁的下一頁按鈕
如果想要利用Scrapy網頁爬蟲框架,繼續爬取第二頁的資料時,就需要取得下一頁的網址,通常都會位於「下一頁」按鈕的href屬性中。
在「下一頁」按鈕點擊右鍵,選擇「檢查」,可以看到它的HTML原始碼。接下來,回到Scrapy專案的spiders/inside.py檔案,在parse()方法(Method)中,即可利用Scrapy框架的xpath()方法(Method),傳入「下一頁」按鈕的樣式類別(class)來進行定位,如下範例:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
yield from self.scrape(response)
# 定位「下一頁」按鈕元素
next_page_url = response.xpath(
"//a[@class='pagination_item pagination_item-next']/@href")
def scrape(self, response):
...
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2021/02/scraping-multiple-pages-with-scrapy.html
)網站觀看更多精彩內容。
拍手 2 留言 0 觀看 100 收藏 0
Mike Ku

Learn Code With Mike品牌創辦人

01/18 21:20

掌握Scrapy框架重要的XPath定位元素方法(下)
XPath(XML Path Language)是一個使用類似檔案路徑的語法,來定位XML文件中特定節點(node)的語言,因為能夠有效的尋找節點(node)位置,所以也被廣泛的使用在Python網頁爬蟲的元素(Element)定位上。
本文就以INSIDE硬塞的網路趨勢觀察網站-AI新聞( https://www.inside.com.tw/tag/ai ),來帶大家來認識如何在Scrapy框架中,使用內建的xpath()方法(Method)來定位想要爬取的網頁內容。
Q: Scrapy如何利用XPath方法取得子元素值?
在開發Python網頁爬蟲時,有很常的機率會需要透過逐層的方式,往下定位所要爬取的子元素(Element),這時候Scrapy xpath()方法(Method)中,所傳入的XPath路徑則跟檔案目錄一樣,一層一層的往下串接。
假設我們想從<div>標籤,逐層往下定位到<a>標籤,XPath路徑就會像以下範例:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
titles = response.xpath(
"//div[@class='post_list_item_content']/h3[@class='post_title']/a/text()").getall()
for title in titles:
print(title)
Q: Scrapy如何利用XPath方法取得元素屬性值?
Python網頁爬蟲除了能夠爬取網頁上顯示的內容外,也可以取得網頁元素(Element)的屬性值,舉例來說,像是<img>圖片的src來源屬性值或<a>超連結的href網址屬性值等,這時候,就需要在Scrapy框架的xpath()方法(Method)最後,加上「@屬性名稱」,如下範例:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
titles = response.xpath(
"//a[@class='js-auto_break_title']/@href").getall()
for title in titles:
print(title)
以上範例,即是爬取所有樣式類別(class)為「js-auto_break_title」的<a>標籤href屬性值,也就是文章標題的網址。
本文簡單示範了Scrapy框架的另一個定位元素方法XPath,很明顯的可以感受到語法和檔案路徑非常相似,使用上也很直覺,重點摘要如下:
1.取得單一元素值呼叫get()方法(Method)
2.取得多個元素值呼叫getall()方法(Method)
3.取得文字內容,加上「/text()」關鍵字
4.取得屬性值則加上「@屬性名稱」關鍵字
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2021/01/scrapy-xpath-selectors.html
)網站觀看更多精彩內容。
拍手 2 留言 0 觀看 64 收藏 0
你可能感興趣的教室
一零四資訊科技股份有限公司 版權所有 © 2022 建議瀏覽器 Chrome / IE11.0 以上