scrapy介紹
Scrapy 是一套基於Twisted、純python實現的異步爬蟲框架,用戶只需要定製開發幾個模塊就可以輕鬆的實現一個爬蟲,用來抓取網頁內容以及各種圖片,相當的方便~
整體架構和組成
- Scrapy Engine(引擎)
引擎負責控制數據流在系統所有組件中的流動,並在相應動作發生時觸發事件,是框架的核心。
- Scheduler(調度器)
調度器從引擎接受request並將他們入隊,在引擎再次請求時將請求提供給引擎。
- Downloader(下載器)
下載器負責獲取頁面數據並提供給引擎,而後提供給spider。
- Spider(爬蟲)
Spider是Scrapy用戶編寫用於分析response並提取item(即獲取到item)或額外跟進的URL的類,定義了爬取的邏輯和網頁內容的解析規則。 每個spider負責處理一個特定(或一些)網站。
- Item Pipeline(管道)
Item Pipeline負責處理被spider提取出來的item。典型的處理有清洗,驗證及持久化(例如存取到數據庫中)
- Downloader Middlewares(下載中間件)
下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的response(也包括引擎傳遞給下載器的Request)。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。
- Spider Middlewares(Spider中間件)
Spider中間件是在引擎及Spider之間的特定鉤子(specific hook),處理spider的輸入(response)和輸出(items及requests)。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。
安裝
<code>pip install scrapy/<code>
爬蟲項目
準備工作
- 創建項目
<code>scrapy startproject xingmingdq/<code>
- 新建爬蟲
<code>scrapy genspider xingming resgain.net/xmdq.html/<code>
這個時候,目錄下會創建xingmingdq文件夾,文件夾下就是xingmingdq scrapy項目,spiders下有xingming爬蟲文件。
建立item
items.py中添加以下代碼:
<code>class Xingming_Item(scrapy.Item):
name = scrapy.Field()
xingshi = scrapy.Field()
xingshi_zh = scrapy.Field()/<code>
爬取名字
爬蟲文件spiders/xingming.py書寫網頁解析規則。
<code># -*- coding: utf-8 -*-
import scrapy
from xingmingdq.items import Xingming_Item
class XingmingSpider(scrapy.Spider):
name = 'xingming'
# allowed_domains = ['www.resgain.net/xmdq.html']
start_urls = ['http://www.resgain.net/xmdq.html']
def parse(self, response):
content = response.xpath('//div[@class="col-xs-12"]/a/@href').extract()
for i in content:
page = 0
href = 'http:' + i
base = href.split('/name')[0] + '/name_list_'
while page < 10:
url = base + str(page) + '.html'
page += 1
yield scrapy.Request(url, callback=self.parse_in_html)
# 解析每一頁
def parse_in_html(self, response):
person_info = response.xpath('//div[@class="col-xs-12"]/div[@class="btn btn-default btn-lg namelist"]/div[@style="margin-top: 20px;"]')
xingshi_zh = response.xpath('//div[@class="navbar-header"]/a/div[@style="text-align: center;"]/text()').extract()[0].split('姓之家')[0]
xingshi = response.url.split('/')[2].split('.')[0]
for every_one in person_info:
name = every_one.xpath('./text()').extract()[0]
the_item = Xingming_Item()
the_item['name'] = name
the_item['xingshi'] = xingshi
the_item['xingshi_zh'] = xingshi_zh
yield the_item/<code>
處理流程
pipelines.py中,編寫結果寫入文件的處理。
<code>class XingmingdqPipeline(object):
def __init__(self):
self.fp = open('xingming.csv', 'w', encoding='utf-8')
def process_item(self, item, spider):
self.fp.write('%s,%s,%s\\n' % (item['name'], item['xingshi_zh'], item['xingshi']))
return item
def close_spider(self, spider):
self.fp.close()/<code>
設置參數
要想執行pipelines,需要在settings.py中進行配置,搜索USER_AGENT和ITEM_PIPELINES進行修改。
<code># 修改USER_AGENT
USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)'
# 配置ITEM_PIPELINES
ITEM_PIPELINES = {
'xingmingdq.pipelines.XingmingdqPipeline': 300,
}/<code>
執行爬蟲
- 命令執行
<code>scrapy crawl xingming/<code>
- 腳本執行
寫入python文件,創建run.py,編輯下面代碼,pycharm中運行。
<code>import os
os.system("scrapy crawl xingming")/<code>
結果文件
詞雲分析
在線詞雲生成網站: https://www.weiciyun.com/
導入爬取的姓名數據,分析出圖:
哈哈哈,最多的竟然是 婷婷
找找有你的名字沒有吧。
閱讀更多 編程樂園 的文章