爬取今日頭條https://www.toutiao.com/首頁推薦的新聞,打開網址獲得以下界面python
查看源代碼你會發現web
全是js代碼,說明今日頭條的內容是經過js動態生成的。json
用火狐瀏覽器F12查看得知api
獲得了今日頭條的推薦新聞的接口地址:https://www.toutiao.com/api/pc/focus/瀏覽器
單獨訪問這個地址獲得dom
此接口獲得的數據格式爲json數據scrapy
咱們用scrapy+selenium+PhantomJS的方式獲取今日頭條推薦的內容ide
下面是是scrapy中最核心的代碼,位於spiders中的toutiao_example.pyurl
# -*- coding: utf-8 -*- import scrapy import json from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import time import re class ToutiaoExampleSpider(scrapy.Spider): name = 'toutiao_example' allowed_domains = ['toutiao.com'] start_urls = ['https://www.toutiao.com/api/pc/focus/'] ###今日頭條焦點的api接口 def parse(self, response): conten_json=json.loads(response.text)
conten_news=conten_json['data'] ###從json數據中抽取data字段數據,其中data字段數據裏面包含了pc_feed_focus這個字段,其中這個字段包含了:新聞的標題title,連接url等信息 for aa in conten_news['pc_feed_focus']: title=aa['title'] link_url='https://www.toutiao.com'+aa['display_url'] ###若是寫(www.toutiao.com'+aa['display_url'])會報錯,加上https://,(https://www.toutiao.com'+aa['display_url'])則不會報錯! link_url_new=link_url.replace('group/','a')###把連接https://www.toutiao.com/group/6574248586484122126/,放到瀏覽器中,地址會自動變成https://www.toutiao.com/a6574248586484122126/這個。因此咱們須要把group/ 替換成a yield scrapy.Request(link_url_new, callback=self.next_parse) def next_parse(self, response): dcap = dict(DesiredCapabilities.PHANTOMJS) # 設置useragent信息 dcap['phantomjs.page.settings.userAgent'] = ( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 ') # 根據須要設置具體的瀏覽器信息 driver = webdriver.PhantomJS(desired_capabilities=dcap) #封裝瀏覽器信息) # 指定使用的瀏覽器, #driver.set_page_load_timeout(5) # 設置超時時間 driver.get(response.url)##使用瀏覽器請求頁面 time.sleep(3)#加載3秒,等待全部數據加載完畢 title=driver.find_element_by_class_name('title').text ###.text獲取元素的文本數據 content1=driver.find_element_by_class_name('abstract-index').text###.text獲取元素的文本數據 content2=driver.find_element_by_class_name('abstract').text###.text獲取元素的文本數據 content=content1+content2 print(title,content,6666666666666666) driver.close() #data = driver.page_source# 獲取網頁文本 #driver.save_screenshot('1.jpg') # 系統截圖保存
運行代碼咱們獲得結果爲標題加內容呈現方式以下blog