文字分類(0)——scrapy爬新浪滾動新聞
阿新 • • 發佈:2018-12-21
這基本上就是一個從入門到差點放棄的故事。。程式碼在最下面
頁面的選擇
這門課需要100萬的中文語料來做文字分類,所以還要自己爬一些。
Problem 1
xPath沒有獲取到任何東西,看了下網頁的原始碼,才發現數據是由Ajax獲取的 然後發現了API是 就決定直接爬介面了。
Problem 2
可能因為他用的jQuery??(純猜測) 嘗試了一下去掉了callback這個引數,返回的就是純json了。 Page是頁碼,lid是新聞的類別,別的就不知道了沒試。
附程式碼
#encoding: utf-8
import scrapy
import re
import sys, os
#sys.setdefaultencoding("utf-8")
from scrapy.selector import Selector
from scrapy.spiders import Spider
from scrapy.http import Request
from third.items import ThirdItem
import json
#import js2py
import time
i=1
base="C:/lyr/Data/tech/"
class techSpider(Spider):
name='tech'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36' ,
}
allowed_domains=['tech.sina.com.cn']
start_urls=[]
for page in range(1,2000):
urls = "https://feed.mix.sina.com.cn/api/roll/get?pageid=153&lid=2515&k=&num=50&page="+str(page)+"&r=0.7643548077821145&callback=&_=1542094996079"
start_urls.append(urls)
def parse(self,response) :
items=[]
item=ThirdItem()
datas=json.loads(response.body)
newsList=datas['result']['data']
#print('Data:',datas['result']['data'])
dataLen=len(datas['result']['data'])
for idx in range(dataLen):
print("Next:",newsList[idx]["url"])
yield Request(url=newsList[idx]["url"], headers=self.headers,callback=self.second_parse)
def second_parse(self,response):
head = response.xpath(u'//h1[@id="main_title"]/text()').extract()
content = ""
content_list=response.xpath(u'//div[@id="artibody"]/p/text()').extract()
for content_one in content_list:
content_one=content_one.replace('\xa0','').replace('\u3000','')
content+=content_one
item=ThirdItem()
item['news_body']=content
item['news_title']=head
global i
dir=base + "tech_"+ str(i) + ".txt"
print(dir)
i = i + 1
fp = open(dir , 'w')
fp.write(item['news_body'])
fp.close()
yield item