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返回…

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…

爬虫——爬取小音乐网站

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

linux基础指令的认识

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

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

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

异常场景分析

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

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

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

基于SSM的定制衣服系统的设计与实现(定制衣服管理平台的设计与开发、智慧服装定制系统的设计与实现、定制衣服管理系统的设计与实现(源码+定制+参考文档)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

机器人的性能指标

1. 负荷能力 负荷能力负荷能力是指机器人在满足其他性能要求的情况下,能够承载的负荷重量。例如,一台机器人的最大负荷能力可能远大于它的额定负荷能力,但是达到最大负荷时,机器人的工作精度可能会降低,可能无法准确地沿着预定的轨迹运动,或者产生额外的偏差。机器人的负荷量与…

【redis-05】redis保证和mysql数据一致性

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

不只是前端,后端、产品和测试也需要了解的浏览器知识(一)

目录标题 一、我们为什么要了解浏览器&#xff1f;1. 对于前端开发者2. 对于后端开发者 二、浏览器发展概述1. 宏观发展2. 微观发展 三、浏览器核心部件1. 浏览器界面介绍2. 目前浏览器的使用的渲染引擎和解释器总结3. 浏览器的解释器 四、各家浏览器目前的市场占比五、整体总结…

索尼MDR-M1:超宽频的音频盛宴,打造沉浸式音乐体验

在音乐的世界里&#xff0c;每一次技术的突破都意味着全新的听觉体验。 索尼&#xff0c;作为音频技术的先锋&#xff0c;再次以其最新力作——MDR-M1封闭式监听耳机&#xff0c;引领了音乐界的新潮流。 这款耳机以其超宽频播放和卓越的隔音性能&#xff0c;为音乐爱好者和专…

tornado

Tornado通过使用非阻塞网络I/O&#xff0c;可以扩展到数以万计的开放链接&#xff0c;非常适合 长时间轮询&#xff0c;WebSockets和其他需要与每个用户建立长期连接的应用程序。 特点 注重性能优越&#xff0c;速度快解决高并发异步非阻塞websockets 长连接内嵌了HTTP服务器…

04 B-树

目录 常见的搜索结构B-树概念B-树的插入分析B-树的插入实现B树和B*树B-树的应用 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O( l o g 2 N log_2N log2​N)二分搜索树无要求O(N)二叉平衡树无要求O( l o g 2 N log_2N log2​N)哈希无要求O(1) 以…

IO模型介绍

一、理解IO 网络通信的本质就是进程间通信&#xff0c;进程间通信本质就是IO TCP中的IO接口&#xff1a;read / write / send / recv&#xff0c;本质都是&#xff1a;等 拷贝 所以IO的本质就是&#xff1a;等 拷贝 那么如何高效的IO&#xff1f; 减少“等”在单位时间的…