安裝scrapy
pip install scrapy
cmd執行scrapy和scrapy bench驗證安裝
原理
engine是引擎,核心大腦
spiders寫爬蟲邏輯,提取資料(item)或者請求,請求交給排程器,資料交給管道
scheduler是排程器(網址的優先隊列,可以去重)
downloader是下載下傳網頁用的
item pipelines用來處理爬下來的item、儲存持久化資料
ab間的中間件:處理ab兩者間請求和響應
engine -> downloader 是下載下傳器中間件(downloader middlewares)
engine -> spiders是爬蟲中間件(spider middlewares)
engine -> scheduler是排程中間件(scheduler middlewares)
實戰
【建立項目-建立爬蟲-分析頁面-運作爬蟲】
爬代理網站ip https://www.xicidaili.com/nn/
- cmd執行 【scrapy startproject xiciSpider】 (項目名)
- 【cd xiciSpider】進入項目路徑(含.cfg檔案)
- 建立爬蟲檔案【scrapy genspider xicidaili xicidaili.com】 (爬蟲名,網站域名)其中爬蟲名和項目名不能一樣,網站域名用來限制可以爬取的網站,防止爬到别的網站。可以後面改。
- 修改settings.py ROBOTSTXT_OBEY = False
- 分析網站(提取資料:正規表達式、Xpath(最佳)、css)[response.xpath]
- 運作爬蟲【scrapy crawl xicidaili】
- 如果爬不了,就加請求頭 改settings
檢視scrapy一共幾個類:
scrapy genspider -l
Available templates:
basic
crawl
csvfeed
xmlfeed
安裝chrome擴充xpath helper
比如//tr/td[2]/text() 是提取所有tr标簽下第2個td标簽的文本
# -*- coding: utf-8 -*-
import scrapy
# 建立爬蟲類,繼承自scrapy.Spider --> 爬蟲最基礎的類,basic crawl csvfeed xmlfeed都繼承自這個類
class XicidailiSpider(scrapy.Spider):
name = 'xicidaili' # 必須唯一
allowed_domains = ['xicidaili.com'] # 允許采集的域名
start_urls = ['https://www.xicidaili.com/nn/'] # 第一次開始采集的網站
# start_urls = [f'https://www.xicidaili.com/nn/{page}' for page in range(1, 4058)] # url list
# 解析response響應資料(網頁源碼) 提取資料或網址
def parse(self, response):
# 提取ip
selectors = response.xpath('//tr') # 選擇所有的tr标簽
# 循環周遊tr标簽下的td标簽
for selector in selectors:
ip = selector.xpath('./td[2]/text()').get() # 傳回list,.get擷取一個,.getall擷取多個,也可用.extract_first()
port = selector.xpath('./td[3]/text()').get() # . 代表目前selector繼續選擇
print(ip, port)
items = {
'ip': ip,
'port': port
}
yield items # 運作時用scrapy crawl xicidaili -o ip.json
# 翻頁
next_page = response.xpath('//*[@class="next_page"]/@href').get()
if next_page:
# 拼接網址
next_url = response.urljoin(next_page)
print(next_url)
# Request送出請求,callback 是将請求得到的響應扔給自己
yield scrapy.Request(next_url, callback=self.parse) # yield是生成器