zoukankan      html  css  js  c++  java
  • python爬虫——论抓包的正确姿势和学好Javascript的重要性(1)

      没事想爬下数据,就入了scrapy坑,跟着https://zhuanlan.zhihu.com/data-factory这篇教程走,中间被小数量的网站坑过,不过还是写出了爬虫~~

      切糕王子:毫无防御,直接scan就可以了;

      尚妆网:进这个网站时才发现,这和说好的不一样!!!这个网站也是采用了拖动到底才加载,不过貌似不能拖到底,要移到稍微上面才能加载?不过那个教程说的根据探查到的url找出规律,再伪装参数这点还是有用的

      批量爬取商品url代码(只有ShowjoySpider):

    # -*- coding: utf-8 -*-
    import time
    import sys
    import random
    reload(sys)
    sys.setdefaultencoding("utf-8")
    from scrapy.spider import BaseSpider
    from scrapy.selector import HtmlXPathSelector
    from tutorial.items import TutorialItem
    from scrapy.http.request import Request
    import re
    
    class ShowjoySpider(BaseSpider):
        name = "Showjoy"
        allowed_domains = ["showjoy.com"]
        start_urls = [
            "http://list.m.showjoy.com/search/?q=cateIds%3A1,cateName%3A%E5%A5%97%E8%A3%85&stock=1"
        ]
    
        # to keep the login status
        cookies = {}
        
        # pretend to visit page by computer/smart phone
        headers = {
            'Connection': 'keep - alive',
            'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0'
            # 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
        }
    
        # to solve the response
        meta = {
            'dont_redirect': False,  # don't ban the redirect
            'handle_httpstatus_list': [301, 302]  # solve the exception
        }
    
        def toFile(self, str, fileName):
            file = open(fileName, "a")
            file.write(str)
            file.write('
    ')
            file.close()
        
        def start_requests(self):
            """
            override function
            """
            yield Request(self.start_urls[0], callback=self.parse, headers=self.headers, cookies=self.cookies, meta=self.meta)
        
        def parse(self, response):
            print 'analyse starting'
            body = response.body
            linklist = re.findall(r'http://item.m.showjoy.com/sku/[0-9]+.html',body)
            # token = sele.select('//input[@name="_synToken"]/@value').extract()[0]
            print 'len=' + str(len(linklist))
            if(len(linklist) == 0):
                return
            # print 'token=' + str(token)
            self.toFile(str(linklist), "urlList.txt")  
            newurl = self.start_urls[0] + '&page='
            exresult = re.search(r'page=(d+)',response.url)
            if(exresult == None):
                print 'page 2'
                # newurl += '2&_synToken=' + str(token)
                newurl += '2'
            else:
                print 'page n'
                newpagenum = int(exresult.group(1)) + 1
                # newurl += str(newpagenum) + '&_synToken=' + str(token)
                newurl += str(newpagenum)
            time.sleep(1)
            yield Request(newurl, callback=self.parse, headers=self.headers, cookies=self.cookies, meta=self.meta)
    View Code

      Taobao/Tmall:其实用PhantomJS就可以比较容易搞定,但是个人觉得这样爬取速度偏慢,想了下决定挑战抓包,结果就被乱且杂的js文件击坠了。。。

      首先为了方便抓数据,user-agent设定为Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0(让网站以为我们是手机,返回小个网站,不过蛋疼的是某些地方点击没反应,要引用selenium.webdriver.common.touch_actions)

      

      进入搜索界面,输入“acm-icpc”到框里出来一堆商品^ ^,查看代码,卧槽有两种url,进去也是不同的代码结构(天猫和淘宝主站不同结构,有你的)。嗯,分别解析代码结构吧

    (注意用手机网页端的话,天猫页面可能会被下载app提示覆盖,用touch_actions去tap对应class按钮再爬)

      一开始的商品信息直接爬了也没关系,没有异步加载的数据,只是销量、价格和地区一定要手动到页面大约第380行,json那里找数据。

     

      标题显式标在html页面,价格(52.93)、月销量(48)和地区(山东青岛)是在下方的json字符串里找到的orz

      商品评论那里抓包比较容易,下面3个包查看内容就知道分别什么内容了(进入评论界面前,请clear之前抓的包)

      

      评论url格式比较标准,https://rate.tmall.com/list_detail_rate.htm?itemId=529090856192&sellerId=741719789&order=3&append=0&content=0&currentPage=1&pageSize=10&tagId=&_ksTS=1500373894842_492&callback=jsonp493

      itemId和sellerId在爬下来的源代码那里就有,除了_ksTS和callback其他的参数直接粘贴,问题就在于不知道如何确定那2个参数

      查看那条url右边的js文件,查找“_ksTS”发现是d.now()+d.guid(),查了下,知道那是淘宝kissy框架的东西,now()根据new Date().getTime(),guid()是唯一标识符,python好像也支持new Date(),但是返回的参数跟js的差好远,要不使用phantomJS完成url拼接抓包是不可能了。。。

      再看商品详情

      特码全是图片,而且url也被层层js覆盖起来了

      

      

      (就是说,商品详情必须用phantomJS爬)

  • 相关阅读:
    Java 泛型 泛型的约束与局限性
    Java 泛型 泛型方法
    Java 泛型 泛型数组
    Java 泛型 协变性、逆变性
    Java 泛型 协变式覆盖和泛型重载
    Java 泛型 泛型代码和虚拟机
    Insertion Sort List
    Remove Duplicates from Sorted List II
    String to Integer (atoi)
    SpringMvc源码入门
  • 原文地址:https://www.cnblogs.com/dgutfly/p/7196996.html
Copyright © 2011-2022 走看看