上次使用beautifulsoup 爬取了猫眼电影TOP100,这次利用最近学习的pyquery再次实战了,感觉比bs4比较好用。
下面分享代码如下,欢迎交流。
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
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)
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))