scrapy爬虫学习笔记

scrapy学习笔记(六)

2018-06-06  本文已影响0人  ATangYaaaa

学以致用,知行合一。

学习scrapy提交POST表单,加上cookies模拟浏览器登陆网页。这部分内容很重要

任务A 爬取11战绩中心任意已知平台数字ID战绩全部内容

该平台战绩中心未经登陆是无法查询战绩的,因此需要模拟浏览器用已有cookies登陆。

首先Firefox安装一个叫Cookie Manager的插件查看浏览器中存储的网页cookies信息:

图一  Cookies信息查询

然后新建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!!!')

图二 带cookies参数爬虫的输出结果

从响应数值200可以看出cookies已经成功发挥了模拟登陆了,可是爬取的结果是‘score’而不是实际的数字!这是为什么?后来经过将网页下载发现文中所有的信息都丢失了,框架还在!

f=open("my.html",'a+')

        print >> f,"%s" % (response.body)

        f.close()

图二 响应网页对应战绩数据处为空白

这是为什么?经过网络分析发现,战绩数据是通过js脚本以POST的方式加载在战绩网页中的!也就是说之前爬取的只是个框架,数据在POST请求之后填到框架中去的!!!

图三 网页的网络抓包过程分析

也就是说,要想得到战绩得通过这个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就包含了所需要查询的战绩信息:

图四 抓取的网页信息包含战绩信息

到这里就基本上熟悉了cookies和POST表单提交的用法,请求头的格式也一样,写一个header={'':'',...}加入到request参数就行了。

这里重点学习FormRequest的POST请求用法,伪装浏览器爬材料实际用途非常大。

实际爬虫中对网页网络动态分析也很重要。

上一篇 下一篇

猜你喜欢

热点阅读