這是我自己在學習python 3爬蟲時的小筆記副签,做備忘用,難免會有一些錯誤和疏漏,望指正~~~
Python 3 爬蟲學習筆記 (一)
Python 3 爬蟲學習筆記 (二)
Python 3 爬蟲學習筆記 (三)
Python 3 爬蟲學習筆記 (四)
Python 3 爬蟲學習筆記 (六)
六、Scrapy初體驗
之前大概學習了下通過urllib和Beautiful Soup 進行簡單數(shù)據(jù)爬取的流程蜕径,但是那只適用于一些簡單的、數(shù)據(jù)量比較小的爬蟲項目街州,如果需要爬取的數(shù)據(jù)量比較大的話评甜,之前的方法必定非常緩慢,所以就有了Scrapy炬搭,Scrapy是一個快速的web抓取框架蜈漓,可抓取web站點并從頁面中提取結構化的數(shù)據(jù)。Scrapy給我們提供了許多的爬蟲基類宫盔,我們可以直接繼承使用融虽,當然,既然Scrapy是一個框架灼芭,我們也可以根據(jù)自己的需要對它進行修改有额,下面我們就慢慢來看Scrapy的使用。
Scrapy is an application framework for crawling web sites and extracting structured data which can be used for a wide range of useful applications, like data mining, information processing or historical archival.
Even though Scrapy was originally designed for web scraping, it can also be used to extract data using APIs (such as Amazon Associates Web Services ) or as a general purpose web crawler.
(一)安裝(Windows)
Scrapy是純Python編寫的彼绷,所以需要一些比較重要的的Python依賴包:
- lxml, an efficient XML and HTML parser
- parsel, an HTML/XML data extraction library written on top of lxml,
- w3lib, a multi-purpose helper for dealing with URLs and web page encodings
- twisted, an asynchronous networking framework
- cryptography and pyOpenSSL, to deal with various network-level security needs
看著依賴包比較多巍佑,其實安裝起來并不復雜,以管理員的身份運行Windows命令提示符寄悯,在以安裝Python的前提下萤衰,運行:
pip install scrapy
pip會自動下載相關依賴包,如果順利的話猜旬,會直接安裝完成脆栋。
要注意的是,確認一下python的版本洒擦,pip會根據(jù)系統(tǒng)自動安裝相關包椿争,即如果系統(tǒng)是64位的,pip就會安裝64位的包熟嫩,但是twisted的版本一定要和python的一樣秦踪,如果操作系統(tǒng)是64位的,python是32位的邦危,pip直接安裝的twisted安裝就會出錯。
如果pip安裝twisted時出錯舍扰,在命令行輸入python倦蚪,查看本地python版本,然后到這里下載和python版本相同的whl文件边苹,使用pip install xxx.whl安裝陵且,完成后再執(zhí)行一遍pip install scrapy即可。
在命令行輸入scrapy, 若不報錯个束,則安裝完成慕购。
(二) 第一個Scrapy項目
照例,先上官方文檔 1.3,找了一下網(wǎng)上翻譯的文檔都是0.24或者0.24版茬底,所以建議大家還是看官方最新的英文版比較好沪悲。
打開命令提示符,進入想要創(chuàng)建項目的目錄阱表,運行
scrapy startproject scrapyTest
項目創(chuàng)建完成殿如,讓我們來看一下項目結構贡珊,執(zhí)行:
tree /f
└─scrapyTest
│ scrapy.cfg # 配置文件(deploy configuration file)
│
└─scrapyTest
│ items.py # 項目中的item文件(project items definition file)
│ middlewares.py # 中間件
│ pipelines.py # 項目中的管道文件(project pipelines file)
│ settings.py # 項目中的設置文件(project settings file)
│ __init__.py
│
├─spiders # 存放爬蟲的文件夾(a directory where you'll later put your spiders)
│ │ __init__.py
│ │
│ └─__pycache__
└─__pycache__
進入spiders目錄,新建test_spider.py如下:
# -*- coding:utf-8 -*-
import scrapy
from bs4 import BeautifulSoup
class tsSpride(scrapy.Spider):
name = 'test' # 爬蟲的唯一名字涉馁,在項目中爬蟲名字一定不能重復
# start_requests() 必須返回一個迭代的Request
def start_requests(self):
# 待爬取的URL列表
urls = ['http://www.reibang.com/',]
# 模擬瀏覽器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
for url in urls:
yield scrapy.Request(url=url, headers=headers, callback=self.parse)
# 處理每個請求的下載響應
def parse(self, response):
soup = BeautifulSoup(response.body, 'html.parser')
titles = soup.find_all('a', 'title')
for title in titles:
print(title.string)
在命令行輸入
scrapy crawl test
結果如下:
上述代碼Scrapy為start_requests 中的每個URL創(chuàng)建了scrapy.Request對象门岔,并將 parse() 方法作為回調(diào)函數(shù)(callback)賦值給了Request(Scray中parse()為默認回調(diào)方法)。
The parse()
method will be called to handle each of the requests for those URLs, even though we haven’t explicitly told Scrapy to do so. This happens because parse()
is Scrapy’s default callback method, which is called for requests without an explicitly assigned callback.
上面代碼中用了Beautiful Soup來處理爬下來的數(shù)據(jù)烤送,而Scrapy也有Selector來處理數(shù)據(jù)寒随,今天先到這里,下次再用一個具體的小項目來更詳細地介紹Scrapy帮坚。