在我们输错密码时按下F12就可查看到如下信息
会发现有个随机的hash值(普遍规律:这种hash值会在网页源码中)
于是我们去网页源码中找
在模拟登录赶集网的时候出现的问题:
1.allowed_domains这个字段的理解,回调函数失败的原因
(把限制域名注释掉就可以了!allowed_domains)
import scrapy
import re
class GanjiSpider(scrapy.Spider):
name = 'ganji'
allowed_domains = ['https://passport.ganji.com/login.php']
start_urls = ['https://passport.ganji.com/login.php']
def parse(self, response):
#这个正则的意思就是打上括号就是只要括号内的东西
hash_code=re.findall(r'"__hash__":"(.+)"',response.text)[0]
yield scrapy.Request(img_url, callback=self.parse_info, meta={'hash_code':hash_code})
#img_url=https://passport.ganji.com/ajax.php?dir=captcha&module=login_captcha&nocache=1583980633551
#为什么出现了调用失败的情况?
def parse_info(self,response):
#传递过来的hash_code在requests中
# hash_code=request.meta,request是在response中的
hash_code=response.request.meta['hash_code']
print(hash_code)
with open('yzm.jpg','wb') as f:
f.write(response.body)
code=input("请输入验证码")
2.
#这个正则的意思就是打上括号就是只要括号内的东西
#函数之间传递参数用meta
#函数之间提交form用FormRequest
# -*- coding: utf-8 -*-
import scrapy
import re
class GanjiSpider(scrapy.Spider):
name = 'ganji'
#allowed_domains = ['https://passport.ganji.com/login.php']
start_urls = ['https://passport.ganji.com/login.php']
def parse(self, response):
#这个正则的意思就是打上括号就是只要括号内的东西
hash_code=re.findall(r'"__hash__":"(.+)"',response.text)[0]
img_url=response.xpath("//*[@id='login-content']/div/div/div[1]/div[2]/form[1]/div[4]/label/img/@src").extract_first()
img_url="https://passport.ganji.com/ajax.php?dir=captcha&module=login_captcha"
#因为访问后才能得到验证码
#函数之间传递参数用meta
#callback后是函数名不是函数,这个已经错误几次了
yield scrapy.Request(img_url, callback=self.parse_info, meta={'hash_code':hash_code})
#为什么出现了调用失败的情况?
def parse_info(self,response):
#传递过来的hash_code在requests中
# hash_code=request.meta,request是在response中的
hash_code=response.request.meta['hash_code']
print(hash_code)
with open('yzm.jpg','wb') as f:
f.write(response.body)
code=input("请输入验证码")
form_data={
'username': '',
'password': '',
'setcookie': '14',
'checkCode': code,
'next': '/',
'source': 'passport',
'__hash__': hash_code
}
login_url="https://passport.ganji.com/login.php"
print(form_data)
yield scrapy.FormRequest(login_url,callback=self.after_login, formdata=form_data)
def after_login(self,response):
print(response.text)