• 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爬)

  • 相关阅读:
    linux 下的mysql
    linux历史命令,索引与键
    root用户删除恢复,mysql二进制及源码安装,mysql关闭,重启,开启命令
    pip3换源,grep,sed ,awk 三剑客,通配符,linux运行django项目
    软硬连接,find命令date命令,du大文件, tar zip压缩解压命令,
    微服务 架构 php+go
    go 优秀 博客文档
    go-001[常用命令]
    go 0000
    web 安全:
  • 原文地址:https://www.cnblogs.com/dgutfly/p/7196996.html
Copyright © 2020-2023  润新知