京東商城大規(guī)模爬蟲

一開始看京東商城的商品鹉戚,發(fā)現(xiàn)很多信息都在網(wǎng)頁源代碼上攒射,以為會比淘寶的大規(guī)模爬取簡單點膘婶,結(jié)果被京東欺騙了無數(shù)次,整整寫了差不多六個小時培愁,真是坑爹啊。先貼上github地址:https://github.com/xiaobeibei26/jingdong

先說下這個網(wǎng)站缓窜,首先在首頁隨便輸入一個想爬取的商品類別定续,觀察到一般商品數(shù)目都是100頁的,除非有些比較稀少的商品禾锤,如圖

Paste_Image.png

介紹一下網(wǎng)站的分析過程私股,默認情況下在首頁輸入一件商品時,出來的搜索頁面是只有30件商品的恩掷,屏幕的右側(cè)下拉框拉到下面會觸發(fā)一個ajax的請求倡鲸,把剩下的30個商品渲染出來,一般每頁60個商品里面是有三個左右是廣告的黄娘,也就是有效商品一般是57個峭状。這里看一下這個AJAX請求,這個是爬取難點

Paste_Image.png

看一看這個請求頭逼争,我當(dāng)時第一個感覺以為很多參數(shù)是可以去掉优床,拿到一個很簡便的鏈接就可以了


當(dāng)時沒注意,刪了很多參數(shù)直接請求誓焦,結(jié)果調(diào)試了很久胆敞,獲得的商品在插進數(shù)據(jù)庫去重的時候都是只剩網(wǎng)頁的一般,細細觀察了一下發(fā)現(xiàn)鏈接雖然不同杂伟,請求回來的商品卻是一樣的竿秆,然后我再細細看了看這個ajax請求,鼓搗了好久稿壁,最終發(fā)現(xiàn)這個URL后面的每個數(shù)字都是每一件商品的ID幽钢,而這個ID隱藏在第一次剛打開網(wǎng)頁時候最初的那些商品里面,如圖.........

Paste_Image.png

這里結(jié)合ajax請求的參數(shù)看傅是,

Paste_Image.png

然后我又從新改掉爬蟲邏輯匪燕,改代碼蕾羊,又花了兩個小時,好慘啊.......

然后終于可以一次提取完整的網(wǎng)頁商品了帽驯,最后提示一下龟再,京東網(wǎng)頁第一頁的商品里面頁數(shù)page是顯示1和2的,第二頁是3和4尼变,這個有點特殊利凑,最后上一張爬蟲主程序圖

# -*- coding: utf-8 -*-
import scrapy

from jingdong.items import JingdongItem

class JdSpider(scrapy.Spider):
    name = "jd"
    allowed_domains = ["www.jd.com"]
    start_urls = ['http://www.jd.com/']


    search_url1 = 'https://search.jd.com/Search?keyword={key}&enc=utf-8&page={page}'

    #search_url2='https://search.jd.com/s_new.php?keyword={key}&enc=utf-8&page={page}&scrolling=y&pos=30&show_items={goods_items}'

    search_url2= 'https://search.jd.com/s_new.php?keyword={key}&enc=utf-8&page={page}&s=26&scrolling=y&pos=30&tpl=3_L&show_items={goods_items}'
    shop_url ='http://mall.jd.com/index-{shop_id}.html'


    def start_requests(self):
        key = '褲子'
        for num in range(1,100):
            page1 = str(2*num-1)#構(gòu)造頁數(shù)
            page2 = str(2*num)
            yield scrapy.Request(url=self.search_url1.format(key=key,page=page1),callback=self.parse,dont_filter = True)
            yield scrapy.Request(url=self.search_url1.format(key=key,page=page1),callback=self.get_next_half,meta={'page2':page2,'key':key},dont_filter = True)
            #這里一定要加dont_filter = True,不然scrapy會自動忽略掉這個重復(fù)URL的訪問

    def get_next_half(self,response):
        try:
            items = response.xpath('//*[@id="J_goodsList"]/ul/li/@data-pid').extract()
            key = response.meta['key']
            page2 =response.meta['page2']
            goods_items=','.join(items)
            yield scrapy.Request(url=self.search_url2.format(key=key, page=page2, goods_items=goods_items),
                                 callback=self.next_parse,dont_filter=True)#這里不加這個的話scrapy會報錯dont_filter嫌术,官方是說跟allowed_domains沖突哀澈,可是第一個請求也是這個域名,實在無法理解

        except Exception as e:
            print('沒有數(shù)據(jù)')



    def parse(self, response):
        all_goods = response.xpath('//div[@id="J_goodsList"]/ul/li')
        for one_good in all_goods:
            item = JingdongItem()
            try:
                data = one_good.xpath('div/div/a/em')
                item['title'] = data.xpath('string(.)').extract()[0]#提取出該標簽所有文字內(nèi)容
                item['comment_count'] = one_good.xpath('div/div[@class="p-commit"]/strong/a/text()').extract()[0]#評論數(shù)
                item['goods_url'] = 'http:'+one_good.xpath('div/div[4]/a/@href').extract()[0]#商品鏈接
                item['shops_id']=one_good.xpath('div/div[@class="p-shop"]/@data-shopid').extract()[0]#店鋪ID
                item['shop_url'] =self.shop_url.format(shop_id=item['shops_id'])
                goods_id=one_good.xpath('div/div[2]/div/ul/li[1]/a/img/@data-sku').extract()[0]
                if goods_id:
                    item['goods_id'] =goods_id
                price=one_good.xpath('div/div[3]/strong/i/text()').extract()#價格
                if price:#有寫商品評論數(shù)是0度气,價格也不再源代碼里面割按,應(yīng)該是暫時上首頁的促銷商品,每頁有三四件磷籍,我們忽略掉
                    item['price'] =price[0]


                yield item
            except Exception as e:
                pass


    def next_parse(self,response):
        all_goods=response.xpath('/html/body/li')
        for one_good in all_goods:
            item = JingdongItem()
            try:
                data = one_good.xpath('div/div/a/em')
                item['title'] = data.xpath('string(.)').extract()[0]  # 提取出該標簽所有文字內(nèi)容
                item['comment_count'] = one_good.xpath('div/div[@class="p-commit"]/strong/a/text()').extract()[0]  # 評論數(shù)
                item['goods_url'] = 'http:' + one_good.xpath('div/div[4]/a/@href').extract()[0]  # 商品鏈接
                item['shops_id'] = one_good.xpath('div/div[@class="p-shop"]/@data-shopid').extract()[0]  # 店鋪ID
                item['shop_url'] = self.shop_url.format(shop_id=item['shops_id'])
                goods_id = one_good.xpath('div/div[2]/div/ul/li[1]/a/img/@data-sku').extract()[0]
                if goods_id:
                    item['goods_id'] = goods_id
                price = one_good.xpath('div/div[3]/strong/i/text()').extract()  # 價格
                if price:  # 有寫商品評論數(shù)是0适荣,價格也不再源代碼里面,應(yīng)該是暫時上首頁的促銷商品院领,每頁有三四件弛矛,我們忽略掉
                    item['price'] = price[0]

                yield item
            except Exception as e:
                pass

pipline代碼如圖

class JingdongPipeline(object):
    # def __init__(self):
    #     self.client = MongoClient()
    #     self.database = self.client['jingdong']
    #     self.db = self.database['jingdong_infomation']
    #
    # def process_item(self, item, spider):#這里以每個用戶url_token為ID,有則更新比然,沒有則插入
    #     self.db.update({'goods_id':item['goods_id']},dict(item),True)
    #     return item
    #
    # def close_spider(self,spider):
    #     self.client.close()






    def __init__(self):
        self.conn = pymysql.connect(host='127.0.0.1',port=3306,user ='root',passwd='root',db='jingdong',charset='utf8')
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        try:#有些標題會重復(fù)丈氓,所以添加異常
            title = item['title']
            comment_count = item['comment_count']  # 評論數(shù)
            shop_url = item['shop_url'] # 店鋪鏈接
            price = item['price']
            goods_url = item['goods_url']
            shops_id = item['shops_id']
            goods_id =int(item['goods_id'])
            #sql = 'insert into jingdong_goods(title,comment_count,shop_url,price,goods_url,shops_id) VALUES (%(title)s,%(comment_count)s,%(shop_url)s,%(price)s,%(goods_url)s,%(shops_id)s,)'
            try:
                self.cursor.execute("insert into jingdong_goods(title,comment_count,shop_url,price,goods_url,shops_id,goods_id)values(%s,%s,%s,%s,%s,%s,%s)", (title,comment_count,shop_url,price,goods_url,shops_id,goods_id))

                self.conn.commit()
            except Exception as e:
                pass

        except Exception as e:
            pass

運行結(jié)果如圖

Paste_Image.png

運行了幾分鐘,每頁一千條谈秫,共爬了幾萬條褲子扒寄,京東的褲子真是多
mysql數(shù)據(jù)庫插入操作

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鱼鼓,一起剝皮案震驚了整個濱河市拟烫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迄本,老刑警劉巖硕淑,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘉赎,居然都是意外死亡置媳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門公条,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拇囊,“玉大人,你說我怎么就攤上這事靶橱×认” “怎么了路捧?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長传黄。 經(jīng)常有香客問我杰扫,道長,這世上最難降的妖魔是什么膘掰? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任章姓,我火速辦了婚禮,結(jié)果婚禮上识埋,老公的妹妹穿的比我還像新娘凡伊。我一直安慰自己,他們只是感情好惭聂,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布窗声。 她就那樣靜靜地躺著,像睡著了一般辜纲。 火紅的嫁衣襯著肌膚如雪笨觅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天耕腾,我揣著相機與錄音见剩,去河邊找鬼。 笑死扫俺,一個胖子當(dāng)著我的面吹牛苍苞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狼纬,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼羹呵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疗琉?” 一聲冷哼從身側(cè)響起冈欢,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盈简,沒想到半個月后凑耻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡柠贤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年香浩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臼勉。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡邻吭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宴霸,到底是詐尸還是另有隱情囱晴,我是刑警寧澤岸裙,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站速缆,受9級特大地震影響降允,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艺糜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一剧董、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧破停,春花似錦翅楼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黑界,卻和暖如春管嬉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朗鸠。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工蚯撩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烛占。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓胎挎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忆家。 傳聞我的和親對象是個殘疾皇子犹菇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容