天天看點

13、web爬蟲講解2—Scrapy架構爬蟲—Scrapy爬取百度新聞,爬取Ajax動态生成的資訊

crapy爬取百度新聞,爬取Ajax動态生成的資訊,抓取百度新聞首頁的新聞rul位址

有多網站,當你浏覽器通路時看到的資訊,在html源檔案裡卻找不到,由得資訊還是滾動條滾動到對應的位置後才顯示資訊,那麼這種一般都是 js 的 Ajax 動态請求生成的資訊

我們以百度新聞為列:

1、分析網站

首先我們浏覽器打開百度新聞,在網頁中間部分找一條新聞資訊

13、web爬蟲講解2—Scrapy架構爬蟲—Scrapy爬取百度新聞,爬取Ajax動态生成的資訊
然後檢視源碼,看看在源碼裡是否有這條新聞,可以看到源檔案裡沒有這條資訊,這種情況爬蟲是無法爬取到資訊的
13、web爬蟲講解2—Scrapy架構爬蟲—Scrapy爬取百度新聞,爬取Ajax動态生成的資訊
那麼我們就需要抓包分析了,啟動抓包軟體和抓包浏覽器,前後有說過軟體了,就不在說了,此時我們經過抓包看到這條資訊是通過Ajax動态生成的JSON資料,也就是說,當html頁面加載完成後才生成的,所有我們在源檔案裡無法找到,當然爬蟲也找不到
13、web爬蟲講解2—Scrapy架構爬蟲—Scrapy爬取百度新聞,爬取Ajax動态生成的資訊
我們首先将這個JSON資料網址拿出來,到浏覽器看看,我們需要的資料是不是全部在裡面,此時我們看到這次請求裡隻有 17條資訊,顯然我們需要的資訊不是完全在裡面,還得繼續看看其他js包
13、web爬蟲講解2—Scrapy架構爬蟲—Scrapy爬取百度新聞,爬取Ajax動态生成的資訊
我們将抓包浏覽器滾動條拉到底,以便觸發所有js請求,然後在繼續找js包,我們将所有js包都找完了再也沒看到新聞資訊的包了
13、web爬蟲講解2—Scrapy架構爬蟲—Scrapy爬取百度新聞,爬取Ajax動态生成的資訊
那資訊就不在js包裡了,我們回頭在看看其他類型的請求,此時我們看到很多get請求響應的是我們需要的新聞資訊,說明隻有第一次那個Ajax請求傳回的JSON資料,後面的Ajax請求傳回的都是html類型的字元串資料,
13、web爬蟲講解2—Scrapy架構爬蟲—Scrapy爬取百度新聞,爬取Ajax動态生成的資訊

我們将Ajax請求傳回的JSON資料的網址和Ajax請求傳回html類型的字元串資料網址,拿來做一下比較看看是否能找到一定規律,

此時我們可以看到,JSON資料的網址和html類型的字元串資料網址是一個請求位址,

隻是請求時傳遞的參數不一樣而已,那麼說明無論傳回的什麼類型的資料,都是在一個請求位址處理的,隻是根據不同的傳參傳回不同類型的資料而已

http://news.baidu.com/widget?id=LocalNews&ajax=json&t=1501348444467   JSON資料的網址

http://news.baidu.com/widget?id=civilnews&t=1501348728134        html類型的字元串資料網址

http://news.baidu.com/widget?id=InternationalNews&t=1501348728196    html類型的字元串資料網址           

我們可以将html類型的字元串資料網址加上JSON資料的網址參數,那是否會傳回JSON資料類型?試一試,果然成功了

http://news.baidu.com/widget?id=civilnews&ajax=json        将html類型的字元串資料網址加上JSON資料的網址參數

http://news.baidu.com/widget?id=InternationalNews&ajax=json    将html類型的字元串資料網址加上JSON資料的網址參數           
13、web爬蟲講解2—Scrapy架構爬蟲—Scrapy爬取百度新聞,爬取Ajax動态生成的資訊

這下就好辦了,找到所有的html類型的字元串資料網址,按照上面的方法将其轉換成JSON資料的網址,然後循環的去通路轉換後的JSON資料的網址,就可以拿到所有新聞的url位址了

crapy實作

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request,FormRequest
import re
import json
from adc.items import AdcItem
from scrapy.selector import Selector

class PachSpider(scrapy.Spider):                            #定義爬蟲類,必須繼承scrapy.Spider
    name = 'pach'                                           #設定爬蟲名稱
    allowed_domains = ['news.baidu.com']                    #爬取域名
    start_urls = ['http://news.baidu.com/widget?id=civilnews&ajax=json']

    qishiurl = [                    #的到所有頁面id
        'InternationalNews',
        'FinanceNews',
        'EnterNews',
        'SportNews',
        'AutoNews',
        'HouseNews',
        'InternetNews',
        'InternetPlusNews',
        'TechNews',
        'EduNews',
        'GameNews',
        'DiscoveryNews',
        'HealthNews',
        'LadyNews',
        'SocialNews',
        'MilitaryNews',
        'PicWall'
    ]

    urllieb = []
    for i in range(0,len(qishiurl)):            #構造出所有idURL
        kaishi_url = 'http://news.baidu.com/widget?id=' + qishiurl[i] + '&ajax=json'
        urllieb.append(kaishi_url)
    # print(urllieb)

    def parse(self, response):                  #選項所有連接配接
        for j in range(0, len(self.urllieb)):
            a = '正在處理第%s個欄目:url位址是:%s' % (j, self.urllieb[j])
            yield scrapy.Request(url=self.urllieb[j], callback=self.enxt)     #每次循環到的url 添加爬蟲

    def enxt(self, response):
        neir = response.body.decode("utf-8")
        pat2 = '"m_url":"(.*?)"'
        url = re.compile(pat2, re.S).findall(neir)      #通過正則擷取爬取頁面 的URL
        for k in range(0,len(url)):
            zf_url = url[k]
            url_zf = re.sub("\\\/", "/", zf_url)
            pduan = url_zf.find('http://')
            if pduan == 0:
                print(url_zf)                       #輸出擷取到的所有url           

【轉載自:

http://www.lqkweb.com