欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-02 22:25:01
...

1.Request和Response
1)scrapy.Request参数
url #指定请求路径
callback #指定解析回调函数
meta # meta 可以实现在spider之间的数据传送
# 主要实现request和response之间的数据共享(回调函数需要的参数)
# meta传参时,value不要使用对象的引用,需要使用常量值
2)response参数
text #网页文本信息
meta #scrapy.Requeat传过来的字典对象
status #响应状态吗
url #响应路径
headers #响应头数据
xpath
……
例:

     yield scrapy.Request(url=str(i['img']),meta={'name':i['name']},callback=self.parse_img)

    def parse_img(self,response):
        print('____saveImg_____')
        # response.meta是读取request中的meta数据
        name = response.meta['name']
        print(name)
        print(response.url)

2.start_requests(self)此方法是spider模块中的定制方法,是一个重写方法,不能修改名字和参数
作用:爬虫从该函数开始,start_urls 和 parse( ) 函数可删除,可在该函数中写入多种请求
1)yield scrapy.Request( )
#get请求,参数与1中相同
2)yield scrapy.FormRequest( )
#post请求
参数:url
formdata #post请求提交的数据,为字典格式
callback #指定解析回调函数
headers #指定post请求头
yield 方法调用前一般加yield表示这个对象给引擎
例:

import scrapy as scrapy
from scrapy.http import HtmlResponse
from gushiwen import ydm_http

class GushiwenSpider(scrapy.Spider):
    name = 'gsw'
    allowed_domain=['www.gushiwen.org','so.gushiwen.org','www.baidu.com']

    def start_requests(self):
        #开始发布请求任务
        print('---Gushiwen 开始发起请求---')

        yield scrapy.Request(url='https://so.gushiwen.org/RandCode.ashx',callback=self.parse)


    def parse(self, response:HtmlResponse):
        with open('yanzhengma.gif','wb') as f:
            f.write(response.body)
        print('验证码下载成功')

        #获取图片内容
        #该获取验证码的途径是通过云打码第三方平台提供的接口
        yzmTxt = ydm_http.ydm('yanzhengma.gif')
        print(yzmTxt)

        login_url = 'https://so.gushiwen.org/user/login.aspx?'
        data={
            'email': '[email protected]',
            'pwd': 'disen8888',
            'code': yzmTxt      # 验证码数据
        }
        #post提交数据
        yield scrapy.FormRequest(url=login_url,formdata=data,callback=self.parse_zw)

    def parse_zw(self,response:HtmlResponse):
        print(response.xpath('//title/text()').extract_first())