crapy爬取百度新聞,爬取Ajax動态生成的資訊,抓取百度新聞首頁的新聞rul位址
有多網站,當你浏覽器通路時看到的資訊,在html源檔案裡卻找不到,由得資訊還是滾動條滾動到對應的位置後才顯示資訊,那麼這種一般都是 js 的 Ajax 動态請求生成的資訊
我們以百度新聞為列:
1、分析網站
首先我們浏覽器打開百度新聞,在網頁中間部分找一條新聞資訊

我們将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資料的網址參數
這下就好辦了,找到所有的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】