python爬虫实战:利用pyquery爬取猫眼电影TOP100榜单内容-2

上次利用pyquery爬取猫眼电影TOP100榜单内容的爬虫代码中点击打开链接 存在几个不合理点。

1. 第一个就是自定义的create_file(文件存在判断及创建)函数。

我在后来的python文件功能相关学习中,发现这个自定义函数属于重复造轮子功能。因为 for data in page.items()这个页面内容提取的循环体中包含的下面代码中with open方法即存在文件存在判断和创建功能。所有没有必要单独自定义create_file函数的必要。

for data in page.items():  #  遍历该页所有node的内容,并获取对应的目标值,然后写入本地
		# print(data,type(data)) #  检验data类型
		# print('1'*50)
		index = data.children('i').text()
		name = data.find('.name').text()
		star = data.find('.star').text()
		releasetime = data.find('.releasetime').text()
		score = data.find('.score').text()
		
		dict['index']=index
		dict['name']=name
		dict['star']=star
		dict['releasetime']=releasetime
		dict['score']=score
		
		with open(file, 'a+', encoding='utf-8') as f: # 打开目标file文件
			f.write(str(dict)+'\n')   # 注意添加 换行符 '\n',实现每个dict自动换行写入txt中		

源代码create_file函数参考:

def create_file(file_path,file):   # 定义 检查和创建目标文件夹和文件的函数  
      
    if os.path.exists(file_path)== False: # check文件夹不存在  
        os.makedirs(file_path)   # 创建新的自定义文件夹  
        fp = open(file,'w')   # 创建新的自定义文件  
    # "w" 以写方式打开,只能写文件,如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件  
      
    elif os.path.exists(file_path)== True: # check文件夹存在  
        with open(file, 'w', encoding='utf-8') as f: # 打开目标文件夹中的文件  
            f.seek(0)  
    # f.seek(offset[,where])把文件指针移动到相对于where的offset位置。where为0表示文件开始处,这是默认值 ;1表示当前位置;2表示文件结尾  
            f.truncate()  
    #清空文件内容,注意:仅当以 "r+" "rb+" "w" "wb" "wb+"等以可写模式打开的文件才可以执行该功能  
  
create_file(file_path,file)  

优化方法: 取消create_file函数,仅保留f.truncate() 清空源文件功能。

2. 在 for data in page.items() 循环体中的电影信息字典添加代码写得有点啰嗦,可以直接进行dict赋值。

优化后代码参考如下:

from pyquery import PyQuery as pq
import requests
import os 
import time

begin = time.clock()  # 添加程序运行计时功能。

file_path = 'D:\python3.6\scrapy\猫眼'   # 定义文件夹,方便后续check文件夹是否存在
file_name = 'maoyan.txt'   # 自定义命名文件名称,
file = file_path+'\\'+file_name     # 创建文件全地址,方便后续引用

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
	
start = "http://maoyan.com/board/4"  # 获取url的开始页
flage='?offset='   # url 变化的标志
node='dd'  # 目标url  对应html 中目标节点
step=10  # url 变化的步进长度
length=100  # url 变化的max


if os.path.exists(file):
	with open(file, 'w', encoding='utf-8') as f: # 打开目标文件夹中的文件
			f.truncate() #清空文件内容,注意:仅当以 "r+" "rb+" "w" "wb" "wb+"等以可写模式打开的文件才可以执行该功能


for n in range(0,length,step): #安装url步进变化爬取每页目标内容, 并存储到本地
	dict ={}	 #创建空字典,用于存储爬取的内容
	if n==0:  #  获取首页url 
		url=start 
		i=n+1  # 自定义 i 表示爬取页数页
	else : #  首页以外url定义 
		url=start+flage+str(n)
		i=(n/10)+1
	r = requests.get(url,headers=headers) #  获取每页的html
	doc=pq(r.text)  #  利用ququery类进行解析
	page=doc.find(node)  #  查找所有node的内容
				
	for data in page.items():  #  遍历该页所有node的内容,并获取对应的目标值,然后写入本地
		# print(data,type(data)) #  检验data类型
		# print('1'*50)
		index = data.children('i').text()
		name = data.find('.name').text()
		star = data.find('.star').text()
		releasetime = data.find('.releasetime').text()
		score = data.find('.score').text()
		
		dict['index']=index
		dict['name']=name
		dict['star']=star
		dict['releasetime']=releasetime
		dict['score']=score
		
		with open(file, 'a+', encoding='utf-8') as f: # 打开目标file文件
			f.write(str(dict)+'\n')   # 注意添加 换行符 '\n',实现每个dict自动换行写入txt中		
	print('第%d页爬取完毕!'%(i))
	
end = time.clock() # 添加程序运行计时功能。
print("爬取完毕,耗时:%f"%(end-begin))

python爬虫实战:利用pyquery爬取猫眼电影TOP100榜单内容-2_第1张图片

python爬虫实战:利用pyquery爬取猫眼电影TOP100榜单内容-2_第2张图片

你可能感兴趣的:(Python,文件创建,pyquery,爬虫)