def parse(self, response): # set_cookies = response.headers.getlist("set-cookie").decode("utf-8") pattern1 = re.compile('csrftoken=(.*?);') pattern2 = re.compile('cfduid=(.*?);') csrftoken = pattern1.findall(response.headers.getlist("set-cookie")[1].decode("utf-8"))[0] cfduid = pattern2.findall(response.headers.getlist("set-cookie")[0].decode("utf-8"))[0] captcha_0= response.css('div input[name*=captcha_0]::attr(value)').get() captcha_1_url= 'https://scrapingclub.com'+str(response.xpath('//div/img/@src').extract()[0]) print(captcha_1_url) captcha_1= input("check captcha then input\n") cookie = { '__cfduid': cfduid, 'csrftoken': csrftoken, # '_ga': 'GA1.2.2039087667.1551428649', # '_gid': 'GA1.2.222080927.1551428649', # 'gat_gtag_UA_39890589_8': 1, } return scrapy.FormRequest('https://scrapingclub.com/exercise/basic_captcha/',cookies=cookie, headers=header, callback=self.parse_login, formdata={ 'name':'scrapingclub', 'password':'scrapingclub', 'csrfmiddlewaretoken':response.css("form input::attr(value)").get(), 'captcha_0':captcha_0, 'captcha_1':captcha_1, } )
这次练习的过程中遇到了很多坑,大坑第一条:因为我每次都是在以前建好的project上直接修改请求地址,修改了starturl后没有修改Formrequest的导致一直获取不到验证码的地址,在scrapy shell试过很多次之后不明白为什么,后来换成xpath,xpath用的少,语法不熟悉又重新查看语法还是不知道为什么,最后突然发现没有改formrequest的url。。。
大坑第二条:一直在纠结 '_ga'和'_gid'这两个东西要不要构造。。。cookie里有,后来搜了下 '_ga'的4段内容分别包含的是什么,最后也没管它,
大坑第三条:'csrfmiddlewaretoken'不知道为什么变成了'csrfmiddleware token'中间多了个空格。。。。。。。。。。试了好几次感觉代码逻辑并没错重新看代码发现了这个问题
大坑第四条:其实刚开始不知道自己是什么分析set cookies的,下次做的时候应该:
1:先空表格网页请求一遍,看response header set cookie设置的是什么值,构造cookie就把set的值放就去就好了
2:输入name密码再请求一遍,看request form data发送了什么值,在构造form request的时候把发送的所有值放进去就好了