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是生成器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值