從零開(kāi)始基于Scrapy框架的網(wǎng)路爬蟲(chóng)開(kāi)發(fā)流程
優(yōu)采云 發(fā)布時(shí)間: 2020-07-06 08:01
前節介紹了哪些網(wǎng)路爬蟲(chóng),什么是Scrapy框架并怎樣安裝
本節介紹基于Scrapy框架的網(wǎng)路爬蟲(chóng)開(kāi)發(fā)流程
安裝好Scrapy框架后,就可以基于Scrapy框架開(kāi)發(fā)爬蟲(chóng)項目了?;诳蚣荛_(kāi)發(fā)項目,不需要從零開(kāi)始編撰代碼,只須要把握怎樣使用框架,如何添加與自己應用相關(guān)的代碼即可。
進(jìn)入準備新建爬蟲(chóng)項目的路徑中,使用命令:
scrapy startproject project_name
請用爬蟲(chóng)項目名稱(chēng)替換命令中的project_name爬蟲(chóng)軟件開(kāi)發(fā),例如,本文準備創(chuàng )建一個(gè)爬取新浪網(wǎng)的爬蟲(chóng),取名為sina_spider,則新建爬蟲(chóng)項目的命令為:
scrapy startproject sina_spider
命令運行結果,如下圖所示。
新建爬蟲(chóng)項目
“scrapy startproject sina_spider”命令會(huì )創(chuàng )建包含下述內容的sina_spider目錄,如圖13-5所示。
爬蟲(chóng)文件夾結構
新建好Scrapy爬蟲(chóng)項目后,接下來(lái)就是創(chuàng )建爬蟲(chóng)文件。請先步入sina_spider項目路徑,用命令:
scrapy genspider spider_filename(爬蟲(chóng)文件名) (待爬取的網(wǎng)站域名)
創(chuàng )建爬蟲(chóng)文件。例如,本文的爬蟲(chóng)文件名為:sinaSpider,待爬取的網(wǎng)站域名:,則創(chuàng )建爬蟲(chóng)文件sinaSpider的命令為:
scrapy genspider sinaSpider
現在好多網(wǎng)站都有防爬蟲(chóng)舉措,為了反網(wǎng)站的防爬蟲(chóng)舉措,需要添加user agent信息。請settings.py文件的第19行更改如下所示:
18. # Crawl responsibly by identifying yourself (and your website) on the user-agent
19. import random
20. # user agent 列表
21. USER_AGENT_LIST = [
22. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
23. "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
24. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
25. "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
26. "Mozilla/4.76 [en_jp] (X11; U; SunOS 5.8 sun4u)",
27. "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
28. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.0) Gecko/20100101 Firefox/5.0",
29. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0",
30. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0",
31. "Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)",
32. "Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)" ]
33. USER_AGENT = random.choice(USER_AGENT_LIST) # 隨機生成user agent
網(wǎng)站的服務(wù)器中保存一個(gè)robots.txt 文件,其作用是,告訴搜索引擎爬蟲(chóng),本網(wǎng)站哪些目錄下的網(wǎng)頁(yè)不希望被爬取收錄。Scrapy啟動(dòng)后,會(huì )在第一時(shí)間訪(fǎng)問(wèn)網(wǎng)站的 robots.txt 文件,然后決定該網(wǎng)站的爬取范圍。
由于本文的項目并非搜索引擎爬蟲(chóng),而且很有可能我們想要獲取的內容恰恰是被 robots.txt所嚴禁訪(fǎng)問(wèn)的,所以請把settings.py文件的ROBOTSTXT_OBEY值設置為False,表示拒絕遵循Robot合同,如下所示
1. # Obey robots.txt rules
2. ROBOTSTXT_OBEY = False # False表示拒絕遵守Robot協(xié)議
查看由Scrapy生成的sinaSpider.py文件,在SinaspiderSpider類(lèi)中,有一個(gè)parse()方法須要用戶(hù)編撰,如下圖所示
編寫(xiě)parse()方法
Scrapy框架把爬取出來(lái)的網(wǎng)頁(yè)源代碼儲存在response對象中爬蟲(chóng)軟件開(kāi)發(fā),我們只須要對response對象中的網(wǎng)頁(yè)源代碼做解析,提取想要的數據即可。本范例目標是抓取新浪網(wǎng)頁(yè)的新聞的標題和對應的鏈接,如下圖所示。
HTML源代碼
parse()方法的實(shí)現代碼,如下所示
1. # -*- coding: utf-8 -*-
2. import scrapy
3.
4. class SinaspiderSpider(scrapy.Spider):
5. name = 'sinaSpider'
6. allowed_domains = ['www.sina.com.cn']
7. start_urls = ['http://www.sina.com.cn/']
8.
9. def parse(self, response):
10. data_list = [] #用于存儲解析到的數據
11. #解析HTML源代碼,定位新聞內容
12. lis = response.xpath("//div[@class='top_newslist']/ul[@class='list-a news_top']//li")
13. #將新聞主題和超鏈接解析出來(lái)并整理到列表中
14. for li in lis:
15. titles = li.xpath(".//a/text()")
16. linkes = li.xpath(".//a/@href")
17. for title, link in zip(titles, linkes):
18. #將新聞主題和對應的超鏈接組合成字典
19. data_dict = {'標題': title.extract(), '鏈接': link.extract()}
20. #將字典數據存儲到data_list這個(gè)列表中
21. data_list.append(data_dict)
22. return data_list
parse()方法在解析HTML源代碼時(shí),使用了XPath路徑表達式。XPath是一門(mén)在HTML/XML文檔中查找信息的語(yǔ)言,常用于在網(wǎng)頁(yè)HTML源代碼中,查找特定標簽里的數據。在網(wǎng)絡(luò )爬蟲(chóng)中使用XPath,只須要把握 XPath路徑表達式即可。XPath 使用路徑表達式來(lái)選定 HTML/XML文檔中的節點(diǎn)或則節點(diǎn)集。
parse()方法編撰好后,就可以運行爬蟲(chóng)程序并保存抓取數據了。用命令:
scrapy crawl 爬蟲(chóng)文件名 –o 保存數據文件名.[csv|json|xml]
保存數據的文件格式可以是csv 或 json 或 xml,本例的爬蟲(chóng)文件名為:sinaSpider.py,數據儲存選擇csv格式,命令為:
scrapy crawl sinaSpider -o sinaNews.csv
運行療效,如下圖所示
運行爬蟲(chóng)
到此,本例基于Scrapy框架從零開(kāi)始實(shí)現了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)程序,爬取了新浪網(wǎng)頁(yè)并從中解析出新聞的標題和對應的超鏈接,最后把解析出的數據保存為csv文件供后續使用。







