用python读取以及存储数据数据

  • Post author:
  • Post category:python


  • 读写文件,用到 with open() 语句:
with open(name,mode,encoding) as file:
    file.write()
#note:with open()后面的语句要有一个缩进

name:包含文件名称的字符串,比如:‘word.txt’

mode:决定了打开文件的模式,只读/写入w/追加等;
encoding:表示我们要写入数据的编码,一般为utf-8 或者 gbk;
file: 表示我们在代码中对文件对象的命名

爬取静态页面

用爬取小猪的例子来看一下
  • 保存为 .txt 格式
from lxml import etree
import requests
import time

with open('/Users/mac/Desktop/xzzf.txt','w',encoding='utf-8') as f:#指定写入的文件的编码为utf-8
    for a in range(1,6):
        url = 'http://cd.xiaozhu.com/search-duanzufang-p{}-0/'.format(a)
        data = requests.get(url).text

        s=etree.HTML(data)
        file=s.xpath('//*[@id="page_list"]/ul/li')
        time.sleep(3)
    
        for div in file:
            title=div.xpath("./div[2]/div/a/span/text()")[0]
            price=div.xpath("./div[2]/span[1]/i/text()")[0]
            scrible=div.xpath("./div[2]/div/em/text()")[0].strip()
            pic=div.xpath("./a/img/@lazy_src")[0]
            
            f.write("{},{},{}, {}\n".format(title,price,scrible,pic)) #主要就是这个  write  方法

作者:DC学院
链接:https://www.jianshu.com/p/e19a53ab735e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 保存为 csv 格式
from lxml import etree
import requests
import time

with open('/Users/mac/Desktop/xiaozhu.csv','w',encoding='utf-8') as f:
    for a in range(1,6):
        url = 'http://cd.xiaozhu.com/search-duanzufang-p{}-0/'.format(a)
        data = requests.get(url).text

        s=etree.HTML(data)
        file=s.xpath('//*[@id="page_list"]/ul/li')
        time.sleep(3)
    
        for div in file:
            title=div.xpath("./div[2]/div/a/span/text()")[0]
            price=div.xpath("./div[2]/span[1]/i/text()")[0]
            scrible=div.xpath("./div[2]/div/em/text()")[0].strip()
            pic=div.xpath("./a/img/@lazy_src")[0]
            
            f.write("{},{},{},{}\n".format(title,price,scrible,pic))

对于csv格式文件,需要注意的就是每个字段之间要用逗号分隔开,所以这里把之前的空格改为了逗号。

这里保存的是 ’utf-8‘格式的编码,打开的是很可能是乱码,此时应该怎么办呢?

我们需要修改编码:

1、在记事本中打开文件
2、另存为-选择编码为  ANSI
爬取动态页面
爬取大量数据的重点在于,通过循环翻页实现重复信息的提取,但是你去联系的时候会发现,很多网站是不翻页的,这TM就尴尬了。
首先来讲,这种动态加载的页面,一般数据会在  Network的 JS 或者 XHR 类目里。

要点击加载更多 的按钮,否则不会出现新的文件。这种就类似于静态页面时,只有翻页的时候才能看到第一页隐藏的url。
然后打开这个文件,会发现这是一个字典:

{        data               :            [dict1,          dict2,           dict3,         ….]       }
代码如下:
import requests
import json
import time

for a in range(3):
    url_visit = 'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'.format(a*20)
    file = requests.get(url_visit).json()   #这里跟之前的不一样,因为返回的是 json 文件
    time.sleep(2)

    for i in range(20):
        dict=file['data'][i]   #取出字典中 'data' 下第 [i] 部电影的信息
        urlname=dict['url']
        title=dict['title']
        rate=dict['rate']
        cast=dict['casts']
    
        print('{}  {}  {}  {}\n'.format(title,rate,'  '.join(cast),urlname))

解释一下代码中的一些细节:

file = requests.get(url).json() 


之前我们用的 .text 是需要网页返回文本的信息,而这里返回的是 json文件所以用 .json()

所以 file  这个变量代表的就是 整个大字典!!!!

dict=file['data'][i]   #代表的就是各个小字典了。
urlname=dict['url']


取出字典中的值,需要在方括号中指明值对应的键

'   '.join(cast)


因为有多名演员,这里用了 join() 函数,在字符串中间加入空格分隔。cast是个列表。join函数接受一个列表,但是列表中的元素都是字符型,然后返回一个字符串

a=['123','234','234']
b='+'.join(a)

b

print(b)
’123+234+234‘
123+234+234