Q:Scrapy網頁爬蟲的建立方法是什麼?
也就是如下指令:
$ scrapy genspider 網頁爬蟲檔案名稱 目標網站的網域名稱
$ scrapy genspider inside www.inside.com.tw
Q:Scrapy網頁爬蟲架構是什麼?
開啟spiders資料夾下的inside.py網頁爬蟲檔案,可以看到Scrapy框架幫我們產生了以下的內容結構:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
pass
其中,包含了以下三個屬性(Attribute)及一個方法:
1. name屬性:網頁爬蟲的名稱,在專案中必須是唯一的。
2. allowed_domains屬性:目標網站的網域名稱清單。
3. start_urls屬性:想要爬取的一至多個網頁網址清單。
4. parse()方法:撰寫網頁爬蟲程式邏輯的地方,特別注意此方法名稱不得更改。
Q:Scrapy網頁爬蟲執行方法是什麼?
由於本文所要爬取的是INSIDE硬塞的網路趨勢觀察網站的AI相關新聞,所以在start_urls屬性的地方,修改為AI新聞的網頁網址,如下範例:
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
pass
接下來,就可以在parse()方法中,撰寫網頁爬蟲的邏輯。在新聞標題的地方,點擊右鍵,選擇「檢查」,可以看到利用<h3>標籤及它的「post_title」樣式類別,就可以定位到新聞標題的元素。
回到Scrapy專案中的inside.py檔案,在parse()方法的地方,就可以來撰寫網頁爬蟲,本文先以BeautifulSoup模組為例進行示範,如下範例:
import scrapy
import bs4
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
soup = bs4.BeautifulSoup(response.text, 'lxml')
titles = soup.find_all('h3', {'class': 'post_title'})
for title in titles:
print(title.text.strip())
接下來,設定settings.py檔案中的User-Agent(使用者代理),簡單來說,就是瀏覽器的相關資訊,如下範例:
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
預設是註解的狀態,所以,將註解取消並且加上User-Agent(使用者代理)。最後,就可以利用「scrapy crawl」指令,加上網頁爬蟲的名稱inside,來執行Scrapy網頁爬蟲,如下範例:
$ scrapy crawl inside