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 reclass 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 statuscookies = {}# pretend to visit page by computer/smart phoneheaders = {'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 responsemeta = {'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('\n')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.bodylinklist = 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 CodeTaobao/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¤tPage=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爬)
轉載于:https://www.cnblogs.com/dgutfly/p/7196996.html
總結
以上是生活随笔為你收集整理的python爬虫——论抓包的正确姿势和学好Javascript的重要性(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS选择器分类与优先级
- 下一篇: 毕业课题之------------图像的