发布网友 发布时间:2024-09-17 21:40
共1个回答
热心网友 时间:2024-09-24 17:25
导读:很多朋友问到关于python爬json数据不知道有多少页的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!
如何在scrapy框架下用python爬取json文件importjson
str=str[(str.find('(')+1):str.rfind(')')]#去掉首尾的圆括号前后部分
dict=json.loads(str)
comments=dict['comments']
#然后for一下就行了
如果是scrapy看下面代码。
defparse(self,response):
jsonresponse=json.loads(response.body_as_unicode())
item=MyItem()
item["firstName"]=jsonresponse["firstName"]
returnitem
Python爬虫(七)数据处理方法之JSON
JSON指的是JavaScript对象表示法(JavaScriptObjectNotation),是轻量级的文本数据交换格式,且具有自我描述性,更易理解。
JSON看起来像python类型(列表,字典)的字符串。
在之前的文章中,我们说到了怎么用response的方法,获取到网页正确解码后的字符串。如果还有不懂的,可以先阅读Python爬虫(三)Requests库。接下来以有道翻译为例子,说说怎么通过网页解码后的字符串,提取到翻译结果。
再结合上述有道翻译的例子,得到字典类型的返回结果,并提取出来翻译结果。
将上述例子的dict_json换成str字符串,再写入文本中。
执行完上述的程序,会得到一个fanyi.txt的文件,其结果如下:{"type":"ZH_CN2EN","errorCode":0,"elapsedTime":1,"translateResult":[[{"src":"\u4eba\u751f\u82e6\u77ed\uff0c\u6211\u7528python","tgt":"Lifeistooshort,Iusepython"}]]}。这样子的一份文档,中文部分显示的是二进制,且格式非常不利于阅读,这并不是我们想要的结果。好在json.dumps()为我们提供的两个方法,以帮助我们更好阅读文档。
1.ensure_ascii,能够让中文显示成中文;
2.indent,能够让下一行在第一行的基础上空格。
其用法如下:
如何爬虫天猫店铺数据python本编博客是关于爬取天猫店铺中指定店铺的所有商品基础信息的爬虫,爬虫运行只需要输入相应店铺的域名名称即可,信息将以csv表格的形式保存,可以单店爬取也可以增加一个循环进行同时爬取。
源码展示
首先还是完整代码展示,后面会分解每个函数的意义。
#-*-coding:utf-8-*-
importrequests
importjson
importcsv
importrandom
importre
fromdatetimeimportdatetime
importtime
classTM_producs(object):
def__init__(self,storename):
self.storename=storename
self.url=''.format(storename)
self.headers={
"user-agent":"Mozilla/5.0(iPhone;CPUiPhoneOS9_1likeMacOSX)AppleWebKit/601.1.46"
"(KHTML,likeGecko)Version/9.0Mobile/13B143Safari/601.1"
}
datenum=datetime.now().strftime('%Y%m%d%H%M')
self.filename='{}_{}.csv'.format(self.storename,datenum)
self.get_file()
defget_file(self):
'''创建一个含有标题的表格'''
title=['item_id','price','quantity','sold','title','totalSoldQuantity','url','img']
withopen(self.filename,'w',newline='')asf:
writer=csv.DictWriter(f,fieldnames=title)
writer.writeheader()
return
defget_totalpage(self):
'''提取总页码数'''
num=random.randint(83739921,87739530)
endurl='/shop/shop_auction_search.do?sort=sp=1page_size=12from=h5ajson=1_tm_source=tmallsearchcallback=jsonp_{}'
url=self.url+endurl.format(num)
html=requests.get(url,headers=self.headers).text
infos=re.findall('\(({.*})\)',html)[0]
infos=json.loads(infos)
totalpage=infos.get('total_page')
returnint(totalpage)
defget_products(self,page):
'''提取单页商品列表'''
num=random.randint(83739921,87739530)
endurl='/shop/shop_auction_search.do?sort=sp={}page_size=12from=h5ajson=1_tm_source=tmallsearchcallback=jsonp_{}'
url=self.url+endurl.format(page,num)
html=requests.get(url,headers=self.headers).text
infos=re.findall('\(({.*})\)',html)[0]
infos=json.loads(infos)
products=infos.get('items')
title=['item_id','price','quantity','sold','title','totalSoldQuantity','url','img']
withopen(self.filename,'a',newline='')asf:
writer=csv.DictWriter(f,fieldnames=title)
writer.writerows(products)
defmain(self):
'''循环爬取所有页面宝贝'''
total_page=self.get_totalpage()
foriinrange(1,total_page+1):
self.get_products(i)
print('总计{}页商品,已经提取第{}页'.format(total_page,i))
time.sleep(1+random.random())
if__name__=='__main__':
storename='uniqlo'
tm=TM_producs(storename)
tm.main()
上面代码是选择了优衣库作为测试店铺,直接输入优衣库店铺的域名中关键词即可,最终表格会按照店铺名称和时间名词。
代码解读
导入库说明
requests?库不用多数,爬取网页的主要库
json?库是用来解析json格式的数据的,也就是Python中的字典格式
csv?库是用来创建csv表格和保存信息的
random?库是用来生成一个随机数的,这个代码中用到了两次,第一次是生成一个随机数据去获取最新的网页信息而不是缓存信息,第二次是随机一个时间,来减缓爬虫速度
re?库是正则,主要用来提取信息
datetime?和?time?都是时间库,前者一般用来生成当前时间字符串,后者本爬虫使用设置延迟时间
爬虫思路
首先通过分析手机端天猫店铺所有商品的网页,可以发现每次下滑一页都有一个js被加载,这个js的规律可以总结一下;
通过分析可以发现每次请求js都可以得到一个关键信息,那就是total_page这个参数,这也一想就能猜到,就是当前店铺的总页码数,所以可以先取得这个数字,然后使用循环爬取全店商品;
每一页有24个商品,而请求得到的是一个类似于json格式的网页信息,但是并非是直接的json,所以可以用正则表达式提取符合json格式的部分留用;
将每一页的信息保存到csv表格中,可以直接使用csv库的字典存储方式,非常方便;
得到了单页的信息,也得到了总页码数,只需要一个循环就可以爬取全店的商品了。
构造爬虫类
def__init__(self,storename):
??self.storename=storename
??self.url='.format(storename)
??self.headers={
????"user-agent":"Mozilla/5.0(iPhone;CPUiPhoneOS9_1likeMacOSX)AppleWebKit/601.1.46"
??????????"(KHTML,likeGecko)Version/9.0Mobile/13B143Safari/601.1"
??}
??datenum=datetime.now().strftime('%Y%m%d%H%M')
??self.filename='{}_{}.csv'.format(self.storename,datenum)
??self.get_file()
上面代码依次完成以下操作:
首先整个爬虫是写成了一个类,在初始化类的时候需要传递一个参数,这个参数就是店铺的名称。
然后构造出店铺的所有商品页面的前半部分,这部分都是不会变的
接着设置一个请求头
按照当前时间生成一个以时间为依据的字符串,用来给文件命名,然后赋值给文件名称,确定保存文件的名称
最后一句是在类生成的时候就运行这个函数,及生成一个带有标题的表格,后面会说道这个函数的具体含义
利用Python爬取数据翻页时,一共100页,我只想要5页的数据,用什么代码停止翻页呢?1、首先分析页面源代码中翻页处的特征,按规则取下一页地址适合页面地址不连续时,可通过正则表达式实现,如果页面地址为连续的,则直接按连续的地址获取数据。
2、按以上特征获取后面地址,通过urllib.request.urlopen(url)得到首页面的数据。可以通过正则表达式获取数据,也可按特征字符串定来取到数据。
3、如为规则网地址方式,可以使用线程来提高效率。
如何用python读取json里面的值啊1、首先需要在桌面新建‘json.txt’文件,内容为jsonline格式。
2、打开Python开发工具IDLE,新建‘json.py’文件,并按照如图所示书写代码。
3、F5运行程序,Shell打印出json文本信息。
4、这是一次性读取所有内容,如果文件很大的情况,出于性能考虑要分批读取内容,这样要用到yield生成器,改写lines()函数如下,注意yield一定要写在with里,这样才能每次从上一次读取的位置继续读取。
5、继续写程序入口函数,这里要注意readlines返回的是一个列表,要读取里面的内容,要再做一个循环来遍历。
6、F5运行程序,Shell打印出json文本信息,这个利用生成器方式读取的方式经常处理较大的文件。
结语:以上就是首席CTO笔记为大家整理的关于python爬json数据不知道有多少页的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~