2016年統(tǒng)計(jì)用區(qū)劃代碼和城鄉(xiāng)劃分代碼
新手開始學(xué)習(xí)scrapy爬蟲,拿國家統(tǒng)計(jì)局的這個(gè)地區(qū)劃分的網(wǎng)頁來練手。
最終目標(biāo)是:把地區(qū)信息按照province->city->country->town的4層存入數(shù)據(jù)庫(網(wǎng)站上5層,但數(shù)據(jù)量太大了,只打算爬4層),在同一張表中,按級別從高到低入庫,自增主鍵,低級的區(qū)域通過parent_id關(guān)聯(lián)上級地區(qū)。
目前打算先把省和市的信息爬出來,也不搞數(shù)據(jù)庫,就以json格式導(dǎo)出就好。
但是一旦從省的頁面獲取到的各省子頁面的url,進(jìn)去爬市的信息,前面的省的信息就不保存了。
scrapy是自己摸索的,可能一開始就把框架理解錯(cuò)了,望大神指出。
import scrapy
from scrapy_test.items import RegionalismItem
class RegionalismSpider(scrapy.Spider):
name = 'regionalism'
def parse(self, response):
pass
def start_requests(self):
url = 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/index.html'
yield scrapy.Request(url=url, callback=self.parse_province)
def parse_province(self, response):
provinces = response.css('tr.provincetr > td')
items = []
for province in provinces:
item = RegionalismItem()
item['name'] = province.css('a::text').extract_first().strip()
item['url'] = response.urljoin(province.xpath('a/@href').extract_first().strip())
items.append(item)
yield scrapy.Request(item['url'], callback=self.parse_city)
yield items
def parse_city(self, response):
citys = response.css('tr.citytr > td:nth-child(2)')
items = []
for city in citys:
item = RegionalismItem()
item['name'] = city.css('a::text').extract_first().strip()
item['url'] = response.urljoin(city.xpath('a/@href').extract_first().strip())
# yield scrapy.Request(item['url'], callback=self.parse_country)
items.append(item)
yield items
無論yield和return怎么改來改去,要么就是什么都沒有,要么就是只有市的信息,沒有省。
請問錯(cuò)誤在哪里?
scrapy聲明字段的時(shí)候是這樣的:
class ScrapyTestItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
源碼里,field是繼承了dict類
class Field(dict):
"""Container of field metadata"""
因此,定義的字段信息是字典dict類型的,而你自定義了一個(gè)列表并yield返回自然就不行了。
回調(diào)函數(shù)有如下定義:
可以去掉items,直接yield item 。
看了一下代碼,約摸估計(jì)就是Item返回值的問題。
就是
items = []
for ...:
item = RegionalismItem()
...
items.append(item)
...
yield items
這部分。
測試了一下,運(yùn)行中出現(xiàn)這樣的錯(cuò)誤,驗(yàn)證了我的猜想。
ERROR: Spider must return Request, BaseItem, dict or None, got 'list' in <GET http://www.stats.gov.cn/tjsj/...;
簡單地說就是數(shù)據(jù)抓到了,但你返回的形式有問題,不應(yīng)該以list的形式返回。
返回值 items=[item1,item2,item3,...] 是不被scrapy接受的,你如果直接返回item就不會(huì)出這樣的問題。
建議直接改成:
for ...:
item = RegionalismItem()
...
yield item
我試了一下,修改之后可以正常抓取數(shù)據(jù)并保存為json文件。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。