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)
在這裏插入圖片描述

實戰

【新建項目-創建爬蟲-分析頁面-運行爬蟲】
爬代理網站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是生成器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章