scrapy学习笔记(六)
学以致用,知行合一。
学习scrapy提交POST表单,加上cookies模拟浏览器登陆网页。这部分内容很重要。
任务A 爬取11战绩中心任意已知平台数字ID战绩全部内容
该平台战绩中心未经登陆是无法查询战绩的,因此需要模拟浏览器用已有cookies登陆。
首先Firefox安装一个叫Cookie Manager的插件查看浏览器中存储的网页cookies信息:
![](https://img.haomeiwen.com/i9606385/1ce95b9eb99eae13.jpg)
然后新建yaoyao工程,yaoyao_spider爬虫进行运行,在其中加入request函数调用cookies参数,注意用法:
# -*- coding: utf-8 -*-
import scrapy
from yaoyao.items import YaoyaoItem
class YaoyaoSpiderSpider(scrapy.Spider):
name = 'yaoyao_spider'
allowed_domains = ['record.5211game.com']
start_urls = ['http://record.5211game.com/Web/?userid=402534141&t=10001']
def start_requests(self):
url="http://record.5211game.com/Web/?userid=402534141&t=10001"
cookies = {
‘参数1名称’:'参数1数值',
‘参数2名称’:'参数2数值',
‘参数3名称’:'参数3数值',
...
‘参数n名称’:'参数n数值'
}
return [scrapy.Request(url,cookies=cookies)]
def parse(self,response):
score = response.xpath('//div[@class="info-box"]/ul/li[1]/span/text()').extract()
print(response,score,'over!!!')
![](https://img.haomeiwen.com/i9606385/d76dd35e27a440ff.jpg)
从响应数值200可以看出cookies已经成功发挥了模拟登陆了,可是爬取的结果是‘score’而不是实际的数字!这是为什么?后来经过将网页下载发现文中所有的信息都丢失了,框架还在!
f=open("my.html",'a+')
print >> f,"%s" % (response.body)
f.close()
![](https://img.haomeiwen.com/i9606385/cc9e48e3d806a1a5.jpg)
这是为什么?经过网络分析发现,战绩数据是通过js脚本以POST的方式加载在战绩网页中的!也就是说之前爬取的只是个框架,数据在POST请求之后填到框架中去的!!!
![](https://img.haomeiwen.com/i9606385/735c05630682350a.jpg)
也就是说,要想得到战绩得通过这个POST方法提交表单才能得到。下面是实际爬虫代码:
# -*- coding: utf-8 -*-
import scrapy
import re
from yaoyao.items import YaoyaoItem
class YaoyaoSpiderSpider(scrapy.Spider):
name = 'yaoyao_spider'
allowed_domains = ['record.5211game.com']
start_urls = ['http://record.5211game.com/Web/?userid=402534141&t=10001']
def start_requests(self):
url="http://record.5211game.com/Web/RecordRequest/record"
form_data = {
'method':'getrecord',
'u':'402534141',
't':'10001'
}
cookies = {
'Hm_lvt_a0e1644dc78102ad7788417192c68694':'1526807116,1528090952,1528182846,1528198671',
'Hm_lpvt_a0e1644dc78102ad7788417192c68694':'1528198671',
'Hm_lvt_5bc2b5a9e04cc13c520047c581f3cc1f':'1526807116,1528090952,1528182846,1528198672',
'Hm_lpvt_5bc2b5a9e04cc13c520047c581f3cc1f':'1528198672',
'5211auth':'SID=zw5nh5z0xryuuwxua3kl22pf&DT=20180605193806&SN=6cee24ece2693ffcec5ea05d526c9a8702b053fa',
'User':'cV9A/kpyz2SBtgg0tvFGesolVHtlZcF3/o25a59s7CXZReG/B2x2csLgiC3FHT2S',
'uToken':'CF003EBCE506CB81FF46583AABD756C75171E97F6F06E5D14D8A7EBFA61393681D0251225E000C31E47D0A4722A0E81C6E826AEA3144E9C78BF6EBED83A33D4410A6AB2DE1F2FE42BA57867B0BCA7FC127C6B3B408B5282678C6CE57327639FC4AF446AFBC007C06A24C4676B73F6B674DB28248999DF9FE6C57DC81559E6DCCBE5B0552BF62DDF04E7E699ECF2369ED8FB77AFED5149FD54D2E1612D5FCAE6FC97EA15A12A32CBBEF12AA3A924802DC97D275E795C37CB6B55CECDE1FAFB8E6C84BEEECDF84B5A4F29E2687C2FF5FB6EC253C2EDB5161BB0E9FCB29EF485E18BDA5006992D1DFE175C76C2375AF5CB8',
'Hm_lvt_db7859a20bc89a8e0eda65c7cc2d8065':'1528090979,1528182867,1528198695,1528199030',
'Hm_lpvt_db7859a20bc89a8e0eda65c7cc2d8065':'1528199218',
'tgw_l7_route':'d1a2a780f2bc6fe1cc75964ea76751eb'
}
return [scrapy.FormRequest(url,cookies=cookies,formdata=form_data)]
def parse(self,response):
print(response,'over!!!')
f=open("data.txt",'a+')
print >> f,"%s" % (response.body)
f.close()
这样在文件夹中新出现的data.txt就包含了所需要查询的战绩信息:
![](https://img.haomeiwen.com/i9606385/f0aa3c88fb1211c1.jpg)
到这里就基本上熟悉了cookies和POST表单提交的用法,请求头的格式也一样,写一个header={'':'',...}加入到request参数就行了。
这里重点学习FormRequest的POST请求用法,伪装浏览器爬材料实际用途非常大。
实际爬虫中对网页网络动态分析也很重要。