1、在学习pandas用法之前,了解过with open的用法,代码参上:
import requests
from lxml import etree
url='https://book.douban.com/subject/1882933/comments/'
r=requests.get(url).text
s=etree.HTML(r)
file=s.xpath('//*[@id="comments"]/ul[1]/li/div[2]/p/span/text()')
with open('pinglun.txt','w',encoding='utf-8') as p:#使用with open()新建对象p
for i in file:
print(i)
p.write(i+"\n")#换行写入数据,文件保存在当前工作目录
可能会遇到的问题:
使用open函数进行保存时,为什么要用with open?
open()也是可以的,但是如果用open,那么在函数后面就一定要加上close。
例如
f=open('test.txt',encoding='utf-8')
data=f.read()
print(data)
f.close()
如果最后不加上close的话,文件就会一直占用系统资源,可能导致其他不安全隐患。
但是这样写起来又很麻烦,所以python自己又搞了一个with open,默认会进行关闭,就不需要每次都加close了。
2、pandas进行保存的代码
import requests
from lxml import etree
url='https://book.douban.com/subject/1882933/comments/'
r=requests.get(url).text
s=etree.HTML(r)
file=s.xpath('//*[@id="comments"]/ul[1]/li/div[2]/p/span/text()')
import pandas as pd
df=pd.DataFrame(file)
print(df.head())#head表示展示前5行数据
df.to_excel('pinglun.xlsx',sheet_name='sheet1')
3、关于翻页内容的抓取
import requests
from lxml import etree
import pandas as pd
urls=['https://book.douban.com/subject/1084336/comments/hot?p={}'.format(str(i)) for i in range(1, 6, 1)] #通过观察的url翻页的规律,使用for循环得到5个链接,保存到urls列表中
pinglun = [] #初始化用于保存短评的列表
for url in urls: #使用for循环分别获取每个页面的数据,保存到pinglun列表
r = requests.get(url).text
s = etree.HTML(r)
file = s.xpath('//div[@class="comment"]/p/span/text()')
pinglun = pinglun + file
df = pd.DataFrame(pinglun) #把pinglun列表转换为pandas DataFrame
df.to_excel('pinglun.xlsx') #使用pandas把数据保存到excel表格
urls=['https://book.douban.com/subject/1084336/comments/hot?p={}'.format(str(i)) for i in range(1, 6, 1)]
函数:str.format(),这个叫做格式化函数,作用就是利用()中的内容来替换str中的变量
比如文中的代码中,翻页页码{}中就是变量,format(str(i))中的i就是用来填补{}。如果有多个变量,那format中就可以写多个内容,不限个数,不限位置,非常方便!
函数:range(),用来创建列表,range(start, stop[, step])
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)