前言
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef
實現過程
製作 Scrapy 爬蟲需如下四步:
- 創建項目 :創建一個爬蟲項目
- 明確目標 :明確你想要抓取的目標(編寫 items.py)
- 製作爬蟲 :製作爬蟲開始爬取網頁(編寫 xxspider.py)
- 存儲內容 :設計管道存儲爬取內容(編寫pipelines.py)
我們以爬取去哪兒網北京景區信息為例,如圖所示:
創建項目
在我們需要新建項目的目錄,使用終端命令 scrapy startproject 項目名 創建項目,我創建的目錄結構如圖所示:
- spiders 存放爬蟲的文件
- items.py 定義數據類型
- middleware.py 存放中間件
- piplines.py 存放數據的有關操作
- settings.py 配置文件
- scrapy.cfg 總的控制文件
定義 Item
Item 是保存爬取數據的容器,使用的方法和字典差不多。我們計劃提取的信息包括:area(區域)、sight(景點)、level(等級)、price(價格),在 items.py 定義信息,源碼如下:
<code>import scrapy
class TicketspiderItem(scrapy.Item):
area = scrapy.Field()
sight = scrapy.Field()
level = scrapy.Field()
price = scrapy.Field()
pass/<code>
爬蟲實現
在 spiders 目錄下使用終端命令 scrapy genspider 文件名 要爬取的網址 創建爬蟲文件,然後對其修改及編寫爬取的具體實現,源碼如下:
<code>import scrapy
from ticketSpider.items import TicketspiderItem
class QunarSpider(scrapy.Spider):
name = 'qunar'
allowed_domains = ['piao.qunar.com']
start_urls = ['https://piao.qunar.com/ticket/list.htm?keyword=%E5%8C%97%E4%BA%AC®ion=&from=mpl_search_suggest']
def parse(self, response):
sight_items = response.css('#search-list .sight_item')
for sight_item in sight_items:
item = TicketspiderItem()
item['area'] = sight_item.css('::attr(data-districts)').extract_first()
item['sight'] = sight_item.css('::attr(data-sight-name)').extract_first()
item['level'] = sight_item.css('.level::text').extract_first()
item['price'] = sight_item.css('.sight_item_price em::text').extract_first()
yield item
# 翻頁
next_url = response.css('.next::attr(href)').extract_first()
if next_url:
next_url = "https://piao.qunar.com" + next_url
yield scrapy.Request(
next_url,
callback=self.parse
)/<code>
簡單介紹一下:
- name:爬蟲名
- allowed_domains:允許爬取的域名
- atart_urls:爬取網站初始請求的 url(可定義多個)
- parse 方法:解析網頁的方法
- response 參數:請求網頁後返回的內容
yield
在上面的代碼中我們看到有個 yield,簡單說一下,yield 是一個關鍵字,作用和 return 差不多,差別在於 yield 返回的是一個生成器(在 Python 中,一邊循環一邊計算的機制,稱為生成器),它的作用是:有利於減小服務器資源,在列表中所有數據存入內存,而生成器相當於一種方法而不是具體的信息,佔用內存小。
爬蟲偽裝
通常需要對爬蟲進行一些偽裝
- 使用終端命令 pip install scrapy-fake-useragent 安裝
- 在 settings.py 文件中添加如下代碼:
<code>DOWNLOADER_MIDDLEWARES = {
# 關閉默認方法
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
# 開啟
'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
}/<code>
保存數據
我們將數據保存到本地的 csv 文件中,csv 具體操作可以參考:CSV 文件讀寫,下面看一下具體實現。
首先,在 pipelines.py 中編寫實現,源碼如下:
<code>import csv
class TicketspiderPipeline(object):
def __init__(self):
self.f = open('ticker.csv', 'w', encoding='utf-8', newline='')
self.fieldnames = ['area', 'sight', 'level', 'price']
self.writer = csv.DictWriter(self.f, fieldnames=self.fieldnames)
self.writer.writeheader()
def process_item(self, item, spider):
self.writer.writerow(item)
return item
def close(self, spider):
self.f.close()/<code>
然後,將 settings.py 文件中如下代碼:
<code>ITEM_PIPELINES = {
'ticketSpider.pipelines.TicketspiderPipeline': 300,
}/<code>
放開即可。
運行
我們在 settings.py 的同級目錄下創建運行文件,名字自定義,放入如下代碼:
<code>from scrapy.cmdline import execute
execute('scrapy crawl 爬蟲名'.split())/<code>
這個爬蟲名就是我們之前在爬蟲文件中的 name 屬性值,最後在 Pycharm 運行該文件即可。
閱讀更多 嗨學python 的文章