天天看點

scrapy爬蟲之原理和簡單實戰

安裝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)

scrapy爬蟲之原理和簡單實戰

實戰

【建立項目-建立爬蟲-分析頁面-運作爬蟲】

爬代理網站ip https://www.xicidaili.com/nn/

scrapy爬蟲之原理和簡單實戰
  • 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是生成器
           

繼續閱讀