scrapy如何GET和POST请求

爬虫爬虫 - 知乎的爬虫 (Scrapy 框架) 背景: 前段时间适应了工作环境之后就寻思开始自己捣鼓点东西玩玩, 于是想啊既然网上这么多爬虫教程什么的,那咱也来凑凑热闹把,毕竟我也很喜欢搞点Data玩一玩。但是拖延了好久,这不趁着回来办签证这功夫赶紧把这个push了! 开发的环境: Mac OSX, Python 3.5, Scrapy 框架   Tips:  为什么使用 Python 3.5? Python 阅读详情

post请求

class FanyiSpider(scrapy.Spider):
    name = 'fanyi'
    allowed_domains = ['baidu.com']
    # start_urls = ['https://fanyi.baidu.com/sug']
    # 引擎调度起来以后首先会从start_urls中提取起始url然后发起get请求,现在把这个属性注释掉,引擎就找不到起始url了,就不会发起默认的get请求
    # 如果要发起post请求,我们需要在这里重写爬虫的周期函数
    def start_requests(self):
        # 这个周期函数,下载器开始下载的时候开启
        print("下载器开始请求网络数据...")
        post_url = "https://fanyi.baidu.com/sug"
        # 创建表单
        data = {
            "kw":'a'
        }
        # 发起post请求
        yield scrapy.FormRequest(url=post_url,formdata=data,callback=self.parse_post) # 下载器对象不能由我们手动,我们需要将下载器创建流程返回给调度器,让调度器去同一调度

    # 定义post请求的回调函数
    def parse_post(self, response):
        print(111111111111111111111111111)
        print(response.text)

GET加POST请求

# -*- coding: utf-8 -*-
import scrapy
import pytesseract
from PIL import Image

class GushiwenSpider(scrapy.Spider):
    name = 'gushiwen'
    allowed_domains = ['gushiwen.org']
    start_urls = ['https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx']

    def parse(self, response):
        # 从response中取出两个token和一个验证码url
        # 取出两个token
        self.token1 = response.css("#__VIEWSTATE::attr(value)").extract()[0]
        self.token2 = response.css("#__VIEWSTATEGENERATOR::attr(value)").extract()[0]
        img_src = "https://so.gushiwen.org"+ response.css("#imgCode::attr(src)").extract()[0]
        # 【注意】scrapy自带的css方法可以直接通过css选择器选择页面中元素,如果我们要提取元素的某属性值直接在选择器后面加上“::attr(某属性)”,如果要提取内容,在选择器后面加上“::text”
        # 下载验证码
        # 调起来一个get下载器,来下载验证码
        yield scrapy.Request(url=img_src,callback=self.parse_code)

    # 封装一个回调函数,用于处理验证码的响应
    def parse_code(self,response):
        # response是验证码图片的响应数据
        with open("./code.png",'wb') as fp:
            fp.write(response.body) # response的二进制是body
        img = Image.open("./code.png")
        img = img.convert("L")
        code = pytesseract.image_to_string(img)
        # 登录接口
        login_url = "https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx"
        # 登录提交的表单数据
        data = {
            "__VIEWSTATE":	self.token1,
            "__VIEWSTATEGENERATOR":self.token2,
            "from":"http://so.gushiwen.org/user/collect.aspx",
            "email":"fanjianbo666@163.com",
            "pwd":"12345678",
            "code":code,
            "denglu":"登录"
        }
        # 返回出去一个post请求的下载器对象
        yield scrapy.FormRequest(url=login_url,formdata=data,callback=self.parse_login)

    # 定义一个回调函数,用于处理登录的响应数据
    def parse_login(self,response):
        print(response.text)
        pass

两个相互关联的爬虫

案例:爬取“穷游网”
“中国”的所有的旅游城市,要爬取的内容
1)城市名,去过的人数,常见的景点,城市的概况
2)进入每个城市的二级页面“旅行地”模块,提取出每个城市的旅行地的如下字段:地名,评分,评论数,推荐锦囊数,排名

city的爬虫器
# -*- coding: utf-8 -*-
import scrapy
from Qiongyou.items import QiongyouItem

class CitySpider(scrapy.Spider):
   name = 'city'
   allowed_domains = ['qyer.com']
   start_urls = ['https://place.qyer.com/china/citylist-0-0-%d/'%i for i in range(1,9)]

   def parse(self, response):
       # print(response.text)
       city_list = response.xpath("//ul[@class='plcCitylist']/li")
       for city in city_list:
           item = QiongyouItem()
           item["cityName"] = " ".join(city.xpath(".//h3//a//text()").extract())
           item["visitorNum"] = city.xpath(".//p[@class='beento']/text()").extract()[0]
           item["scenicSpot"] = "".join(city.xpath(".//p[@class='pois']//text()").extract())
           item["cityNum"] = city.xpath(".//h3//a/@href").extract()[0].split("/")[-2]
           # 取出城市的pid
           item["cityPid"] = city.xpath(".//p[@class='addPlanBtn']/@data-pid").extract()[0]
           # 城市的概况在下级页面中,所以在这里要匹配出下级页面的url
           next_url = "https://place.qyer.com/" + item["cityNum"] + "/profile/"
           print(next_url)
           # 发起请求,打开二级页面提取数据
           yield scrapy.Request(url=next_url,callback=self.parse_next,meta={"item":item})
           # response有一个属性叫做meta,用于记录响应的相关信息,这个属性可以自定义,在发起Request请求的时候,把我们item放入到meta,此时item就可以跟着响应数据对象传入到下级页面

   def parse_next(self,response):
       # print(response.meta)
       item = response.meta["item"] # 取出上级页面中传过来的item对象
       item["cityInfo"] = "\n".join(response.xpath("//div[@class='entry_main']//text()").extract()) # 继续解析上级页面中没有解析完的item

       yield item

#travel爬虫器
# -*- coding: utf-8 -*-
import scrapy
import redis
import json
class TravelSpider(scrapy.Spider):
   name = 'travel'
   allowed_domains = ['qyer.com']
   # start_urls = ['http://qyer.com/']
   def start_requests(self):
       print("开始请求...")
       # 1)从redis数据库中提取出城市pid和城市的代号
       rds = redis.StrictRedis(host="www.fanjianbo.com",port=6379,db=8)
       lens = rds.llen("Qiuyou:cityList")
       print(lens)
       city_list = rds.lrange("Qiuyou:cityList",0,lens)
       # print(city_list)
       # 定义两个列表分别用于存储pid和城市代号
       pid_list = []
       cityNum_list = []
       for c in city_list:
           city = json.loads(c)
           pid_list.append(city["cityPid"])
           cityNum_list.append(city["cityNum"])
       # 2)将城市代号拼接出城市的旅游景点的列表页,从中提取出总页数
       for i in range(len(cityNum_list)):
           city_url = "https://place.qyer.com/" + cityNum_list[i] + "/alltravel/"
           print("正在向:%s发起请求!"%city_url)
           yield scrapy.Request(url=city_url,callback=self.parse_city,meta={"pid":pid_list[i]})
   # 定义一个回调函数用于处理每个城市的旅游景点列表的页面
   def parse_city(self, response):
       pid = response.meta["pid"]
       # 解析出每个城市景点列表页的总页数
       total_pages = response.xpath("//a[@class='ui_page_item']/@data-page").extract()
       if len(total_pages) != 0:
           # 抓取每一页每一页的数据
           for page in range(1,int(total_pages[-1])+1):
               post_url = "https://place.qyer.com/poi.php?action=list_json"
               data = {
               'page': str(page),
               "type": "city",
               "pid": str(pid),
               "sort": '0',
               "subsort": "all",
               "isnominate": '-1',
               "haslastm": "false",
               "rank": '0'
               }
               yield scrapy.FormRequest(url=post_url,formdata=data,callback=self.parse_post)

   def parse_post(self, response):
       # print(response.text)
       # 练习:json解析并且存储景点页面
       pass

  • 管道文件
import redis
import json
class QiongyouPipeline(object):
    def open_spider(self,spider):
        # 判断爬虫
        if spider.name == "city":
            self.rds = redis.StrictRedis(host="www.fanjianbo.com",port=6379,db=8)
        pass
    def process_item(self, item, spider):
        if spider.name == "city":
            self.rds.lpush("Qiuyou:cityList",json.dumps(dict(item)))
        return item

    def close_spider(self,spider):
        pass

scrapy框架中的Request对象以及Response对象的介绍【python爬虫入门进阶】(19) scrapy框架中的Request对象以及Response对象 阅读详情

相关推荐

Python爬虫之Scrapy框架系列(16)——深入剖析request和response类

Python爬虫之Scrapy框架系列(16)——深入剖析request和response类

孤寒者的博客 2万+

Python爬虫——9.scrapy框架get/post请求

接触了这么久的scrapy框架,你是否会疑惑,在scrapy底层,代码到底是怎么运行的呢?原来由一个起始url,通过scrapy.Request()函数会默认封装为一个get请求对象,该对象触发找到引擎模块scrapy.engine,引擎模块指向调度模块scrapy.schedule,调度模块接收到后对start_urls列表进行有序排列,然后将信息返回给引擎,引擎转而启动下载模块进行数据的采集,

编程我在行 5424

解决PADs VX2.7安装中的License失效与软件卡死问题

本文详细解析了PADs VX2.7安装过程中常见的License失效与软件卡死问题,提供了从破解工具选择、环境变量设置到输入法兼容性调整等实用解决方案。特别推荐使用Siemens EDA系列新版破解工具,并分享性能调优与定期维护技巧,帮助工程师高效解决安装难题。

weixin_29234239的博客 813

02-15 scrapy-手动发送请求(get)(爬取多页+递归解析)

一、如何手动爬取重点 1、使用场景: 爬取多个页码(有很多页的网页)对应的页面源码数据 2、url构造 ①进入网页的起始url (起始urlscrapy会自动发送请求) ②定义一个通用的url模板(多个url时需手动发送请求) 3、递归根式函数 yield scrapy.Request(url,callback) 其中解析函数parse为递归函数 4、scrapy一般发送get请求 发送post请求如下(不常用): data={ #post请求的参数 'kw':'xxx' }

weixin_46400833的博客 1018

细胞膜电学特性的分数阶微积分建模

分数阶微积分在细胞膜电学特性建模中的应用主要体现在对细胞膜的电容行为和神经元放电活动的更精确描述上。

冰河世纪20的博客 623

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

scrapy 手动发起GET POST请求

可以用于发送更灵活的 POST 数据,如 JSON 数据或自定义的请求头。data = {url,body=json.dumps(data), # 转换为JSON。

Azx的博客 780

华为昇腾310P3+deepseek蒸馏版性能调优:FP16精度优化全记录

本文详细介绍了在华为昇腾310P3硬件环境下优化DeepSeek蒸馏版模型FP16精度的关键技术路径。通过分层量化策略、内存分配优化和并行计算配置,显著提升模型推理性能,实现83%的并发处理能力提升,同时保持98.7%的原始模型准确率。

weixin_29074409的博客 348

Python爬虫:Scrapy的get请求和post请求

scrapy 请求继承体系 Request |-- FormRequest get请求 from scrapy import Spider, Request, cmdline class SpiderRequest(Spider): name = "spider_request" def start_requests(self): url = "http...

彭世瑜的博客 1万+

从零到一:RK3588嵌入式开发中的SDK与MPP集成实战解析

本文详细解析了RK3588嵌入式开发中SDK与MPP(Media Process Platform)的集成实战,涵盖开发环境构建、SDK架构解析、MPP集成关键技术点及常见问题诊断。通过Qt5.12.10交叉编译环境配置和硬件加速优化,帮助开发者高效完成嵌入式视觉项目开发,特别适合边缘计算应用场景。

weixin_29189381的博客 511

【并发编程五】c++进程通信——共享内存(shared memmory)

现代操作系统,对于内存管理,采⽤的是虚拟内存技术,也就是每个进程都有⾃⼰独⽴的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程 A中 和 进程 B中 的虚拟地址是⼀样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。这样这个进程写⼊的东⻄,另外⼀个进程⻢上就能看到了,都不需要拷⻉来拷⻉去,传来传去,⼤⼤提⾼了进程间通信的速度。⽤了共享内存通信⽅式,带来新的问题,那就是如果多个进程同时修改同⼀个共享内存,很有可能就冲突了。那共享内存的⽅式,就很好的解决了这⼀问题。

junxuezheng的博客 1万+

Scrapy深入理解(一)

Scrapy理解(一) Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动...

lixinghua666的博客 587

【社招算法经验贴】算法社招记录

总的来说,也是收获了七七八八的offer,给的涨幅40~100%,职级有的可以对标到 p7(但阿里p7是真难a,a不动)。面了一圈下来,感觉大模型也在收缩hc。尤其是多模态相关hc。凭着上学期间做过相关视觉的work和paper,社招虽然能进面试,但是hc少得可怜,多模态已死慎入。还有大模型应用算法给的涨幅,跟搜广推的涨幅差别不大。真正能几百万往上的是基座pretrain/后训练/infra,但是全靠social和conn,hc极少。

Danger的博客 977

Scrapy框架:Request和Response对象,使用Request发送get请求、FormRequest发送post请求

创建爬虫 scrapy startproject renren cd renren scrapy gensipder -c crawl renren_login "renren.com" 修改settings.py代码 爬虫部分代码 # -*- coding: utf-8 -*- import scrapy ''' 登录人人网,访问大鹏页面 post、get请求 ''' class RenrenLoginSpider(scrapy.Spider): name = 'renren_

旧人小表弟的博客 - 无业游民学习笔记 3133

Python 爬虫实战:华尔街见闻精选文章爬取(反反爬 + 投资情绪分析)

Python 爬虫实战:华尔街见闻精选文章爬取(反反爬 + 投资情绪分析)

yansideyucsdn的博客 970

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

python 框架 scrapy_python之框架篇(scrapy)

一、项目创建#创建步骤:scrapy startproject mySpider #mySpider是项目名字scrapy genspider apider文件名 www.XXX.com#配置文件settings中USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Geck...

weixin_39977586的博客 437

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

scrapy请求发送详解

scrapy自动发送请求   对start_urls列表中存储的起始url进行过请求的发送并没有通过手动实现,但是在parse函数中还是获取到了响应数据,这是因为爬虫文件中的爬虫类继承到了Spider父类中的start_requests(self)这个方法,该方法就可以对start_urls列表中的url发起请求: 1 def start_requests(self): 2...

diaolouan9546的博客 462

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Scrapy | 手动请求发送实现的数据爬取-段子王网站

手动请求发送实现爬虫数据获取,涉及回调函数

HG0724的博客 433

scrapy爬虫url或者body中遇到随机数或者随机字符串该如何去重(或过滤)

爬虫链接或者body中遇到随机数或者随机字符串该如何去重(或过滤)

fendouwhy的博客 2405

Scrapy--post请求和模拟登录--start_requests(self)

1.Request和Response 1)scrapy.Request参数 url #指定请求路径 callback #指定解析回调函数 meta # meta 可以实现在spider之间的数据传送 # 主要实现request和re...

mutong_wu的博客 2906

scrapy框架核心知识Spider,Middleware,Item Pipeline,scrapy项目创建与启动,Scrapy-redis与分布式

详细介绍scrapy核心组件spider,middleware item pipeline的使用,代码复用度高,示例可拓展开发。

Jesse_Kyrie的博客 1016

Scrapy请求与响应

Scrapy请求与响应

lizhixin200的博客 1916

Scrapy进阶封装(第五阶段:爬虫模板初步封装,简化请求和翻页功能)

本阶段讲解爬虫模板初步封装,包括简化请求方法,简化翻页方法,要有基础,掌握此章节,爬虫开发效率进一步提高,此框架一般用于企业级项目。

m0_64408930的博客 1万+

scrapy的使用

scrapy的简单使用

weixin_49177159的博客 165

scrapy框架----post请求方式

# -*- coding: utf-8 -*- import scrapy import json ''' 1 sug的这个不能单独使用 --》没有响应 2 这个请求是一个post请求 既然是post请求 参数就不能拼接 --》参数怎么办 scrapy的post请求: 因为是post请求 那么请求参数和请求资源路径就是分开的 如果是分开的 那么单独的请求资源路...

Eric 的博客 895

scrapy框架学习

一、IP代理池(比较简陋,后续更新) 验证ip,proxies用的是两个协议,http和https都要有 import re import requests url = 'https://tool.lu/ip' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36

挚友的博客 3834
上一篇: greenlet实现协程
下一篇: scrapy的增量爬虫(未完待续。。。)
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值