- 读写文件,用到 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