scrapy爬虫基础

一、初识

创建项目:

scrapy startproject my_one_project    # 创建项目命令
cd my_one_project                     # 先进去, 后面在里面运行
运行爬虫命令为:scrapy crawl tk

spiders下创建test.py 

        其中name就是scrapy crawl tk ,运行时用的


# spiders脚本
import scrapyclass TkSpider(scrapy.Spider):name = 'tk'                    # 运行爬虫命令为:scrapy crawl tkstart_urls = ['https://www.baidu.com/']def parse(self, response, **kwargs):print(1111)print(response.text)

运行时:

[scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET https://www.baidu.com/>

so所以:

settings.py中

访问百度地址就设置这个
ROBOTSTXT_OBEY = False不想看那么多东西,可以设置这个
LOG_LEVEL = 'ERROR'   #分别为 CRITICAL< ERROR < WARNING < INFO < DEBUG  (设置为 ERROR ,就不会展示INFO)

再次运行


二、start_requests中完成请求

如下图: 红框的代码可以写可以不写,都是一个效果,但是写了可以在请求前,准备headers 或者cookies

(在执行parse前,实际上是执行了 start_requests的,在这里面实现了请求)

 但是写的话,可以在start_requests方法中,

  1. 发出请求之前执行一些额外的操作。如放一个cookie值、headers来请求
    传递了cookie请求后就能获取响应了
  2. 请求发出之后,如获取本次请求使用的header (但是实际请求还在更内部的地方,这里只能给header加一项而已)

实现随时登录,请求时会默认带上最新的cookie,或响应token

新建一个方法,如下为do_login(), 把下面内容放进去

   for url in self.start_urls:yield scrapy.Request(url=url, callback=self.parse)

再原来的start_requests里, scrapy.FormRequest 完成登录请求,并回调 do_login()

就可以把新的header  或cookie使用了

例:

A 这样是获取不到数据的


# spiders脚本
import scrapyclass TkSpider(scrapy.Spider):name = 'tk'                         # 运行爬虫命令为:scrapy crawl tk# allowed_domains = ['17k.com']       # 允许爬取的域名start_urls = ['http://124.223.33.41:7081/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20']def start_requests(self):login_url = 'http://124.223.33.41:7081/api/mgr/loginReq'# yield scrapy.FormRequest(#     url=login_url,#     formdata={'username': 'auto', 'password': 'sdfsdfsdf'},#     callback=self.do_login# )for url in self.start_urls:yield scrapy.Request(url=url, callback=self.parse)def do_login(self, response):print("-----------",response.text)# print("-----------", response)'''登陆成功后调用parse进行处理cookie中间件会帮我们自动处理携带cookie'''for url in self.start_urls:yield scrapy.Request(url=url, callback=self.parse)def parse(self, response, **kwargs):print(response.text[:400])print(response.request.cookies)     # 这是?

下面实现了登录,自己携带了cookie去传,就能获取到数据了


# spiders脚本
import scrapyclass TkSpider(scrapy.Spider):name = 'tk'                         # 运行爬虫命令为:scrapy crawl tk# allowed_domains = ['17k.com']       # 允许爬取的域名start_urls = ['http://124.223.33.41:7081/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20']def start_requests(self):login_url = 'http://124.223.33.41:7081/api/mgr/loginReq'yield scrapy.FormRequest(url=login_url,formdata={'username': 'auto', 'password': 'sdfsdfsdf'},callback=self.do_login)def do_login(self, response):print("-----------",response.text)# print("-----------", response)'''登陆成功后调用parse进行处理cookie中间件会帮我们自动处理携带cookie'''for url in self.start_urls:yield scrapy.Request(url=url, callback=self.parse)def parse(self, response, **kwargs):print(response.text[:400])print(response.request.cookies)     # 这个东西,查不到实际请求时传的cookies

三、 [下载中间件] 配置项

settings.py中有一个配置项

DOWNLOADER_MIDDLEWARES ={ 
#"my_one_project.middlewares.MyOneProjectDownloaderMiddleware": 544,
"项目名.模块名.自定义类名":543       # 数字表示下载中间件的执行顺序
}

如果执行了该配置项,会在请求前去执行这个自定义类 。通常写在middlewares.py 中

3.1. 下载中间件的初体会

故意写错地址,我们便可以看见下载中间件各方法的执行顺序。

3.2. 例1:[下载中间件类]中,设置请求头和cookie

用到:process_request,在请求被发送之前调用

1. middlewares.py中,添加一个自定义类

class CustomHeadersMiddleware:def process_request(self, request, spider):# 修改请求头request.headers['User-Agent'] = 'My Custom User Agent'request.headers['Referer'] = 'https://example.com'  # 添加 Referer# 设置cookies(登录17k.com页面后,复制cookies过来的)cookies = 'GUID=6dbc18ae-3e1a-47cc-8fdd-cfbbb8d29fae; sajssdk_2015_cross_new_user=1; Hm_lvt_9793f42b498361373512340937deb2a0=1724903619,1727255561; HMACCOUNT=395943C30BE9D378; c_channel=0; c_csc=web; acw_sc__v2=66f536769a4e77584871dbebc1a65686278ddfec; ssxmod_itna=muDtGKiK0IeIxWq0LqYKOPCT3Mtd5D74HtRmRtLDBL84iNDnD8x7YDvmIN34pb4pDbA4OF=nxIxDkrQn2rL/lmSNoDU4i8DCur43bDen=D5xGoDPxDeDACqGaDb4Dr2qqGPc0EkH=ODpxGrDlKDRx07Vg5DWEFKaebkhDDzwQbPoWDD4xi3f=HFP/yhDivquarPfxG1DQ5Dsx2Lr4DC03kYg=yEERg3m=BGDCKDjE7Ck1YDUn9zcPKvVC03oCGe/mgNLBGqkD2x5eRD/nuxtWDyoC2DrmrYtnix7QVPhDDWdjGeSqhDD; ssxmod_itna2=muDtGKiK0IeIxWq0LqYKOPCT3Mtd5D74HtRmRRD8T687uEDGNLPGaf30ssIx8OrPk5t7drYO/GmO7YC5b42h=rBRmQhU3ijInPthaFB6B=2z1taqFCBKMTAueiZpAZOBK1MZzpmPd86SA8NMCf+qi8fqZwdMtLA5X+dcKkfDXRtcIrA3poUZCRE4UbWfiRiw4x+N6hrOUCvF=wactl3s33qUGYxVKl0ebSI5sT5cK7742urC7Pth0QoIm9vwyqAp2poc013oVMUyba0P2g5hzlOR2PWxxc4/tl=y5LACaPoIKj4m9RKs0muYKD8ILWhEe0UjNN1qsn6FpvCe2003h0Xq40n23vm5tgfUn20jDaDG2Cr3/0vteE9hOzrKWOP4Td1hORR32rYt9qDqeGRQcoNvRDD3dT54tPiEobdbx3DDFqD+hmiB+4Dh1/oV7ca3D===; accessToken=avatarUrl%3Dhttps%253A%252F%252Fcdn.static.17k.com%252Fuser%252Favatar%252F18%252F98%252F90%252F96139098.jpg-88x88%253Fv%253D1650527904000%26id%3D96139098%26nickname%3D%25E4%25B9%25A6%25E5%258F%258BqYx51ZhI1%26e%3D1742898500%26s%3D93ee3faf573907f7; tfstk=g-IKgtfny5VnWqHZ4baMrG3ZupegsgBFt6WjqQAnP1COU_nnx3xHPLO9eXthFW5R2C16t6bhE1HFXsnoxWzFF0KkVSV0moXeL3-7iH1JdhleEp9QqUiWC9r0VxMLmoXFdvvQnOZ0U2G10IOWVeTQfCOwd39WO_O65K9mO3t5NRh6LKlIRLTB5lOwF3O5N3GqT7dsdQmRz_GxjKhTHci1XpLpw0AZ2uykKedfdCFbGGnWJI6B60N0qD3ewCSbsPBNaw1HQ_EY635NP_9R1fNk8T_O6pC3MbRlY9jJQ9HqmOLJ9NsBWYi5CHRRiaCL92RC-1L2CFM80dfD19SCW8l1dsApAdTgc-B6PNjeuMVsvn_VKHb5ar0wvT_BXgJlmiU38jx6T2eTB4uyRd-naHIvCZiVzdd0pu3rzFywBI2TB4uyRdJ9iJFKz48aQ; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2296139098%22%2C%22%24device_id%22%3A%221922d7043b49b1-0aa4e0296c703d-26001151-2073600-1922d7043b5f1a%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%2C%22first_id%22%3A%226dbc18ae-3e1a-47cc-8fdd-cfbbb8d29fae%22%7D; Hm_lpvt_9793f42b498361373512340937deb2a0=1727346501'# 需要注意的是 传递cookies类型为字典cookie_dict = {i.split('=')[0].strip(): i.split('=')[1].strip() for i in cookies.split(';')}# print(cookie_dict) # {'GUID': '6db....d29fae', 'sajssd....._user': '1', 'Hm_lvt_9...b2a0': '172...561', ...}request.cookies = cookie_dictreturn None  # 返回 None 继续处理请求

2. settings.py 中进行配置

DOWNLOADER_MIDDLEWARES = {# "my_one_project.middlewares.MyOneProjectDownloaderMiddleware": 544,'my_one_project.middlewares.CustomHeadersMiddleware': 543,  # 数字表示执行顺序
}

3. spiders下的test.py


# spiders脚本
import scrapyclass TkSpider(scrapy.Spider):name = 'tk'                         # 运行爬虫命令为:scrapy crawl tkallowed_domains = ['17k.com']       # 允许爬取的域名start_urls = ['https://user.17k.com/ck/user/myInfo/96139098?bindInfo=1&appKey=2406394919']def start_requests(self):for url in self.start_urls:request = scrapy.Request(url=url, callback=self.parse,headers={"name":"taoke"})print("------",request.headers)yield requestdef parse(self, response, **kwargs):print("响应结果,msg:success表示成功",response.text[:120])print(response.request.headers)     # 类型: <class 'scrapy.http.headers.Headers'>

命令行中运行> scrapy crawl tk

3.3. 例2:[下载中间件类]中,设置请求头__随机一个user_agent

a.在settings中添加UA的列表
USER_AGENTS_LIST = [ 
"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" ]
b.在middlewares.py中添加自定义类

process_request 中,每次请求前去配置中随机一个user_agent

import random
from 你的项目名.settings import USER_AGENTS_LIST # 注意导入路径,请忽视pycharm的错误提示(不想报,可以用pycharm打开项目,进入到项目中)class UserAgentMiddleware(object):def process_request(self, request, spider):user_agent = random.choice(USER_AGENTS_LIST)request.headers['User-Agent'] = user_agent

定义process_response,获取每次的headers中的User agent

class UserAgentMiddleware(object):# ....def process_response(self, request, response, spider):print("process_response-----------")print(request.headers['User-Agent'])return response
c. settings中配置
DOWNLOADER_MIDDLEWARES = {'你的项目名.middlewares.UserAgentMiddleware': 543,
}

每次运行,可以发现获取到了不同user_agent

3.4. 例3:请求使用代理

a. middlewares.py 中,可以单独搞个如下的类, 当然也要配置到settings中,下面就不写了

class ProxyMiddleware:def process_request(self, request, spider):request.meta['proxy'] = 'http://127.0.0.1:8888' # 主要要写http, https开头return None  # 可以不写return

如上,我是使用的本地fiddler, 这样请求会经过fiddler

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cpp::STL—string类的使用与理解(上)(8)

文章目录 前言一、string类对象的构造函数string()string(const char* s)string(size_t n, char c)string(const string& s)string(const string& str&#xff0c;size_t pos&#xff0c;size_t len npos) 二、string类对象的容量操作size与lengthcapacitycapacity返回…

缓存穿透、击穿、雪崩及解决方案

在分布式系统中&#xff0c;尤其是使用缓存的系统中&#xff0c;缓存雪崩、缓存穿透和缓存击穿是常见的问题。下面详细说明这三者的定义和解决方案&#xff1a; 1. 缓存穿透 定义&#xff1a;缓存穿透是指请求的数据在缓存和数据库中都不存在。由于每次请求都会直接查询数据库…

Docekrfile和docker compose编写指南及注意事项

Dockerfile 基础语法 我们通过编写dockerfile,将每一层要做的事情使用语法固定下来&#xff0c;之后运行指令就可以通过docker来制作自己的镜像了。 构建镜像的指令&#xff1a;docker build /path -t imageName:tag 注意&#xff0c;docker build后的path必须是dockerfile…

阿里云对象存储OSS 速学

目录 1.创建一个Bucket 2.创建密钥AccessKey 3.在文档中心打开阿里云对象存储OSS 4.参考上传文件示例 以官网的文档为主&#xff0c;我的文章教学为辅 官网有详细的视频介绍&#xff1a; OSS快速入门_对象存储(OSS)-阿里云帮助中心 (aliyun.com)https://help.aliyun.com/…

25考研咨询周开启,西安电子科技大学是否改考408??

学长这几天帮大家问了西安电子科技大学是否会从833、834、953改考为408&#xff1f; 西电老师回复&#xff1a;根据上级文件要求&#xff0c;招生简章以及专业目录会在网上报名开始前公布&#xff0c;专业课不会又大变动&#xff01; 因为大家安心复习即可&#xff0c;保证今…

java解决跨域问题时的403报错

什么是跨域问题&#xff1f; 当一个请求的url的协议&#xff0c;域名&#xff0c;端口三者之间任意一个与当前页面url不同 即为跨域 问题背景&#xff1a; 如图&#xff0c;前端端口为8090&#xff0c;而后端端口为8099&#xff0c;形成跨域&#xff0c;无法对接 试图利用Spr…

【数据库】数据库课程设计mysql

数据库课程设计MySQL是一个涉及多方面内容的综合性项目&#xff0c;旨在通过实践加深对MySQL数据库的理解和应用。以下是一个基于MySQL的数据库课程设计概览&#xff0c;包括设计步骤、关键技术和操作示例。 一、数据库设计步骤 需求分析&#xff1a; 确定系统的功能需求和数据…

爬虫——爬取小音乐网站

爬虫有几部分功能&#xff1f;&#xff1f;&#xff1f; 1.发请求&#xff0c;获得网页源码 #1.和2是在一步的 发请求成功了之后就能直接获得网页源码 2.解析我们想要的数据 3.按照需求保存 注意&#xff1a;开始爬虫前&#xff0c;需要给其封装 headers {User-…

卫生间门口墙皮天天掉,是墙面“返潮”造成的?

业主说房子装修好5年了&#xff0c;卫生间防水出问题了&#xff0c;去现场看一下&#xff0c;看看能怎么处理。      到了工地以后&#xff0c;业主说卫生间门口两侧的墙皮都已经脱落了&#xff0c;天天往下掉&#xff0c;实在没办法了&#xff0c;就在墙上钉了几块纸壳子。…

linux基础指令的认识

在正式学习linux前&#xff0c;可以简单认识一下linux与win的区别 win&#xff1a;是图形界面&#xff0c;用户操作更简单&#xff1b;在刚开始win也是黑屏终端 指令操作&#xff0c;图形界面就是历史发展的结果。Linux&#xff1a;也存在图形界面比如desktop OS&#xff1b;但…

Ubuntu24.04桌面版下的网络管理

systemd-networkd组件 注意&#xff1a;systemd-network和NetworkManager组件两者冲突 使用systemd-networkd之前&#xff0c;需要先关闭其他网络管理器&#xff0c;如NetworkManager, netctl&#xff0c;dhcp daemon&#xff0c;dhcpcd, dhclient等 systemctl stop NetworkM…

【C++】模拟实现红黑树

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现RBTreeNode类模板 &#x1f38f;构造RBTreeNode类成员变量 &#x1f38f;实现RBTreeNode类构…

Flutter modal_bottom_sheet 库:介绍与使用指南

Flutter的官方showModalBottomSheet方法虽然功能强大&#xff0c;但在某些场景下可能不够灵活。为了解决这个问题&#xff0c;社区提供了一个非常实用的第三方库——modal_bottom_sheet。这个库扩展了官方的ModalBottomSheet功能&#xff0c;提供了更多的自定义选项和更丰富的用…

异常场景分析

优质博文&#xff1a;IT-BLOG-CN 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、异常处理类 Java把异常当做是破坏正常流程的一个事件&#xff0c;当事件发生后&#xff0c;…

C 语言预处理详解:从宏替换到条件编译

目录&#xff1a; 前言1. 什么是预处理&#xff1f;2. 头文件展开3. 去注释4. 宏替换4.1 什么是宏&#xff1f;4.2 宏的作用范围4.3 使用宏的小Tips4.4 # 和 ##4.5 宏替换 vs 去注释 5. 条件编译5.1 什么是条件编译&#xff1f;5.2 条件编译的使用5.3 条件编译的作用 总结 前言…

什么是区块链桥?

什么是区块链桥&#xff1f; 区块链桥是一种实现资产从一个区块链转移至另一个区块链的工具&#xff0c;它解决了区块链技术中不同网络之间缺乏互操作性的问题。区块链桥通过创建代表另一区块链资产的合成衍生品&#xff0c;使得原本互不兼容的区块链资产能够相互连接和转移。…

Spring Boot新闻推荐:实时数据处理

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

JSR303微服务校验

一.创建idea 二.向pom.xml添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.7.RELEASE</version></parent><properties><java.vers…

【Git】Git在Unity中使用时的问题记录

个人向笔记。 &#xff08;为什么没截图&#xff0c;因为公司电脑没法截图&#xff01;&#xff09; 1 前言 主要记录在使用Git协同开发时的各种问题&#xff0c;方便以后查阅。 2 记录 2.1 合并冲突 git pull下来后直接给合并了&#xff0c;麻了。若不想直接合并应该先把分…

职业技术学校开设无人机培训技术详解

职业技术学校开设无人机培训技术&#xff0c;是一个涉及多个方面的综合性教学过程。以下是对该培训技术的详细解析&#xff1a; 一、培训目标 无人机培训技术的目标在于培养学员掌握无人机的基本原理、组装调试、飞行操作、安全规范及维修保养等技能&#xff0c;使其成为具备…