創建項目
創建項目是爬取內容的第一步,之前已經講過,Scrapy通過scrapy startproject <project_name>
命令來在當前目錄下創建一個新的項目。
下面我們創建一個爬取博客園('https://www.cnblogs.com/')文章信息的項目
scrapy startproject cnblog
其中cnblog
是你的項目的名字,可以自己定義。
其目錄結構如下
cnblog/
scrapy.cfg
cnblog/
__init__.py
items.py
pipelines.py
middlewares.py
settings.py
spiders/
__init__.py
下面簡單的講解一下各目錄/文件的作用:
- scrapy.cfg
項目的配置文件,帶有這個文件的那個目錄作為scrapy項目的根目錄 - items.py
定義你所要抓取的字段 - pipelines.py
管道文件,當spider抓取到內容(item)以后,會被送到這里,這些信息(item)在這里會被清洗,去重,保存到文件或者數據庫。 - middlewares.py
中間件,主要是對功能的拓展,你可以添加一些自定義的功能,比如添加隨機user-agent, 添加proxy。 - settings.py
設置文件,用來設置爬蟲的默認信息,相關功能開啟與否,比如是否遵循robots協議,設置默認的headers,設置文件的路徑,中間件的執行順序等等。 - spiders/
在這個文件夾下面,編寫你自定義的spider。
編寫爬蟲
編寫spider文件
在項目中的spiders文件夾下面創建一個文件,命名為cnblog_spider.py我們將在這個文件里面編寫我們的爬蟲。先上代碼再解釋。
import scrapy
class Cnblog_Spider(scrapy.Spider):
name = "cnblog"
allowed_domains = ["cnblogs.com"]
start_urls = [
'https://www.cnblogs.com/',
]
def parse(self, response):
title = response.xpath('//a[@class="titlelnk"]/text()').extract()
link = response.xpath('//a[@class="titlelnk"]/@href').extract()
print(title)
print(link)
- 導入scrapy模塊
- 定義一個spider類,繼承自scrapy.Spider父類。
下面是三個重要的內容
- name: 用於區別Spider。 該名字必須是唯一的,不可以為不同的Spider設定相同的名字。這一點很重要。
- start_urls: 包含了Spider在啟動時進行爬取的url列表。第一個被獲取到的頁面將是其中之一。即這是爬蟲鏈接的起點,爬蟲項目啟動,便開始從這個鏈接爬取,后續的URL則從初始的URL獲取到的數據中提取。
- parse() 是spider的一個方法。 被調用時,每個初始URL完成下載后生成的 Response 對象將會作為唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成需要進一步處理的URL的 Request 對象。
修改settings.py文件
將settings.py文件里面的下列內容修改如下,其余的內容不動。
ROBOTSTXT_OBEY = False #不遵循robots協議
#去掉下面的這個注釋,以設置請求頭信息,偽造瀏覽器headers,並手動添加一個user-agent
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
#user-agent新添加
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
運行我們的爬蟲項目
至此,項目必要的信息已經全部完成了,下面就是運行我們的爬蟲項目
進入帶有scrapy.cfg文件的那個目錄,前面已經說過,這是項目的根目錄,執行下面的命令
scrapy crawl cnblog
cnblog
是spiders/cnblog_spider.py文件里面我們定義的那個具有唯一性的name
你會發現打印出了博客園首頁的文章列表和文章的url信息,如下所示。