Python-Scripy

scrapy-使用

1、scrapy框架项目实现流程
创建一个scrapy项目:scrapy startproject mySpider
生成一个爬虫:scrapy genspider itcast "itcast.cn"
提取数据:完善spider,使用xpath等方面
保存数据:pipeline中保存数据
2、创建一个scrapy项目
命令:scrapy startproject + <项目名字>
实例: scrapy startproject myspider
生成的目录和文件结构分析
  items.py 自己预计需要爬去的内容
  middlewares.py 自定义中间件的文件
  pipelines.py 管道,保存数据
  setting.py 设置文件,UA,启动管道
  spiders 自定义的spider的文件夹
  scrapy.cfg 项目的配置文件
3、命令创建爬虫
命令: scrapy genspider +<爬虫名字> + <允许爬取的域名>

示例:scrapy genspider itcast itcast.cn

crawlspider类的使用

1、crawlspider-简介
CrawlSpider 是 Scrapy 框架中的一个通用爬虫类,专门设计用于处理需要跟踪链接的网页抓取任务。与基本的 Spider 类相比,CrawlSpider 提供了更高级的功能,特别是通过定义一组规则(Rule)来自动处理页面中的链接,并根据这些规则决定哪些链接应该被跟进,以及如何解析这些链接指向的页面。

2、crawlspider-特点
1、规则定义:
  CrawlSpider 使用 Rule 对象来定义抓取行为。每个 Rule 对象指定了如何提取链接、哪些链接需要跟进、以及如何处理跟进链接的响应。
  规则通常包括一个 LinkExtractor(用于提取链接)和一个回调函数(用于处理响应)。
2、自动跟进链接:
  CrawlSpider 会自动根据规则提取页面中的链接,并决定是否跟进这些链接。这使得它非常适合抓取具有层次结构或分页的网站。
3、灵活性:
  虽然 CrawlSpider 是自动化的,但它仍然允许开发者通过自定义规则和回调函数来控制抓取过程。
3、用命令创建一个crawlspider的模块:
> scrapy genspider -t crawl <爬虫名字> <all_domain>

> scrapy genspider -t crawl itcast itcast.cn
4、关键组件
1、LinkExtractor:
  用于从页面中提取链接。可以通过参数(如 allow、deny、allow_domains 等)来控制提取哪些链接。
2、Rule:
  定义抓取规则,包括如何提取链接、是否跟进链接、以及如何处理响应。
3、parse_item:
  用于处理跟进链接的响应。可以在这里提取数据或执行其他操作。
4、rules:
  是一个元组或者是列表,包含的是Rule对象
5、callback :
  表示经过连接提取器提取出来的url地址响应的回调函数,可以没有,没有表示响应不会进行回调函数的处理
6、follow:
  表示进过连接提取器提取的url地址对应的响应是否还会继续被rules中的规则进行提取,True表示会,Flase表示不会
5、示例
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class MyCrawlSpider(CrawlSpider):
    name = 'mycrawlspider'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        Rule(LinkExtractor(allow=()), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        yield {
            'title': response.css('title::text').get(),
            'url': response.url,
        }

class Itcast1Spider(CrawlSpider):
    name = 'itcast1'
    allowed_domains = ['itcast.cn']
    start_urls = ['http://itcast.cn/']

    rules = (
        Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        i = {}
        #使用xpath进行数据的提取或者url地址的提取
        return i

scrapy-下载中间件

1、下载中间件-简介:
  在 Scrapy 中,下载中间件(Downloader Middleware)是一个强大的机制,允许开发者在请求发送到下载器之前或响应返回给爬虫之前对其进行处理。下载中间件可以用于修改请求、处理响应、处理异常、实现自定义的重试逻辑等。
2、下载中间件-作用:
  下载中间件位于 Scrapy 引擎和下载器之间,可以拦截并处理以下内容:
    请求(Request):在请求发送到下载器之前,可以修改请求的 URL、头信息、Cookies 等。
    响应(Response):在响应返回给爬虫之前,可以修改响应内容或生成新的响应。
    异常(Exception):在下载过程中发生异常时,可以捕获并处理异常。

  应用场景:
    设置全局请求头:例如添加 User-Agent、Referer 等。
    代理管理:动态切换代理 IP。
    请求重试:自定义重试逻辑,例如根据状态码或异常类型重试。
    响应处理:例如解压缩响应内容、修改响应体等。
    异常处理:例如捕获超时异常并记录日志。
3、下载中间件-使用:
3-1、下载中间件的执行顺序
  Scrapy 的下载中间件按照定义的顺序依次执行。每个中间件可以选择处理请求/响应,或者将其传递给下一个中间件。中间件的顺序在 settings.py 文件中通过 DOWNLOADER_MIDDLEWARES 设置。
3-2、Downloader Middlewares默认的方法:
process_request(self, request, spider):
# 当每个request通过下载中间件时,该方法被调用。
# 返回None值:继续请求
# 返回Response对象:不在请求,把response返回给引擎
# 返回Request对象:把request对象交给调度器进行后续的请求
process_response(self, request, response, spider):
# 当下载器完成http请求,传递响应给引擎的时候调用
# 返回Resposne:交给process_response来处理
# 返回Request对象:交给调取器继续请求
3-3、示例:
class CustomHeaderMiddleware:
    def process_request(self, request, spider):
        # 添加自定义请求头
        request.headers['X-Custom-Header'] = 'MyCustomValue'
        # 返回 None 表示继续处理请求
        return None

    def process_response(self, request, response, spider):
        # 可以在这里修改响应
        return response

    def process_exception(self, request, exception, spider):
        # 处理异常
        pass

# 在 settings.py 文件中启用自定义的下载中间件:
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomHeaderMiddleware': 543,  # 543 是优先级,数字越小优先级越高
}
3-4、示例-实现随机User-Agent的下载中间件:
class UserAgentMiddleware(object):

def process_request(self,request,spider):
    agent = random.choice(agents)
    request.headers['User-Agent'] = agent

# User-Agent池
USER_AGENTS = [
  "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.  30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
  "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET   CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
  "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727;   InfoPath.2; .NET CLR 3.0.04506.30)",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/  419.3) Arora/0.3 (Change: 287 c9dfb30)",
  "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.  6",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
  "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]
3-5、示例-实现随机使用代理的下载中间件:
class ProxyMiddleware(object):

def process_request(self,request,spider):
    proxy = random.choice(proxies)
    request.meta['proxy'] = proxy

scrapy-模拟登录

1、对比request 和 selenium 模拟登录
1、requests:
    1-1、 直接携带cookies请求页面
    1-2、接口发送post请求存储cookie
2、selenium:
    2-1、找到对应的input标签,输入文字点击登录
3、scrapy:
    3-1、直接携带cookie
    3-2、找到发送post请求的url地址,带上信息,发送请求
2、scrapy携带cookie进行模拟登陆
2-1、携带cookie进行模拟登陆应用场景
  1、cookie过期时间很长,常见于一些不规范的网站
  2、能在cookie过期之前把搜有的数据拿到
  3、配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到保存到本地,scrapy发送请求之前先读取本地cookie
2-2、scrapy的start_requests方法
def start_requests(self):
    cls = self.__class__
    
    if method_is_overridden(cls, Spider, 'make_requests_from_url'):
        warnings.warn(
            "Spider.make_requests_from_url method is deprecated; it "
            "won't be called in future Scrapy releases. Please "
            "override Spider.start_requests method instead (see %s.%s)." % (
                cls.__module__, cls.__name__
            ),
        )
        for url in self.start_urls:
            yield self.make_requests_from_url(url)
    else:
        for url in self.start_urls:
            yield Request(url, dont_filter=True)
2-3、示例:实现携带cookie登陆人人网
import scrapy
import re

class RenrenSpider(scrapy.Spider):
    name = 'renren'
    allowed_domains = ['renren.com']
    start_urls = ['http://www.renren.com/941954027/profile']

    def start_requests(self):
        cookie_str = "cookie_str"
        cookie_dict = {i.split("=")[0]:i.split("=")[1] for i in cookie_str.split("; ")}
        
        yield scrapy.Request(
            self.start_urls[0],
            callback=self.parse,
            cookies=cookie_dict,
            # headers={"Cookie":cookie_str}
        )

    def parse(self, response):
        ret = re.findall("新用户287",response.text)
        print(ret)
        yield scrapy.Request(
            "http://www.renren.com/941954027/profile?v=info_timeline",
            callback=self.parse_detail
        )

    def parse_detail(self,response):
        ret = re.findall("新用户287",response.text)
        print(ret)

# 在settings中开启cookie_debug
# 在settings.py中通过设置 COOKIES_DEBUG=TRUE 能够在终端看到cookie的传递过程

3、示例:使用scrapy模拟登陆github
3-1、实现步骤
1、获取登录页面的 CSRF 令牌:GitHub 的登录表单通常包含一个 CSRF 令牌,用于防止跨站请求伪造攻击。
2、发送 POST 请求提交登录表单:包括用户名、密码和 CSRF 令牌。
3、处理登录后的会话:确保后续请求携带登录后的 Cookies。
3-2、创建一个Script 项目
> scrapy startproject github_login
> cd github_login
3-3、编写 Spider
在 spiders 目录下创建一个新的 Spider 文件(如 github_spider.py):
import scrapy
from scrapy.http import FormRequest

class GithubLoginSpider(scrapy.Spider):
    name = 'github_login'
    start_urls = ['https://github.com/login']  # GitHub 登录页面

    def parse(self, response):
        # 提取 CSRF 令牌
        csrf_token = response.css('input[name="authenticity_token"]::attr(value)').get()
        
        # 提交登录表单
        return FormRequest.from_response(
            response,
            formdata={
                'login': 'your_username',  # 替换为你的 GitHub 用户名
                'password': 'your_password',  # 替换为你的 GitHub 密码
                'authenticity_token': csrf_token,
            },
            callback=self.after_login
        )

    def after_login(self, response):
        # 检查是否登录成功
        if "Sign in to GitHub" in response.text:
            self.logger.error("Login failed")
        else:
            self.logger.info("Login succeeded")
            # 登录成功后可以继续抓取其他页面
            yield scrapy.Request(
                url='https://github.com/settings/profile',  # 例如抓取个人资料页面
                callback=self.parse_profile
            )

    def parse_profile(self, response):
        # 提取登录后的页面数据
        profile_name = response.css('.vcard-fullname::text').get().strip()
        self.logger.info(f"Profile Name: {profile_name}")
3-4、配置 settings.py
在 settings.py 中启用 Cookies 和 User-Agent 中间件,并设置一个合法的 User-Agent:
# 启用 Cookies
COOKIES_ENABLED = True

# 设置 User-Agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

# 降低日志级别(可选)
LOG_LEVEL = 'INFO'
3-5、运行 Spider
在项目根目录下运行以下命令启动爬虫:
scrapy crawl github_login

posted on   cloud_wh  阅读(13)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示