前期准备,首先要有python环境+scrapy环境+pycharm环境
一、建立爬虫所需的环境,在命令行输入:
scrapy startproject doubantv #命名自定义就好
会生成一个名为doubantv的文件夹,cd进入doubantv文件夹,在进入spiders文件夹,执行命令,新建爬虫文件:
scrapy gensipder tv "https://movie.douban.com" #注明爬虫文件名,要爬取的网址域
然后就可以用pycharm打开doubantv文件了。
二、编写爬虫文件
https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E8%A7%86%E5%89%A7&start=0#爬取的网址
我们会发现这个页面是通过ajax异步加载来不断获取页面的,通过我们细心的观察不难发现,每次加载页面都会出现一个有规律的网址,也就是上面给出的这个网址。因此我们就可以非常轻松的获取完整的页面信息了。
首先添加想要爬取的字段信息。
由于我们只是个人学习测试使用,所以就随机选择几个字段进行爬取:
在iteam文件编写
import scrapyclassDoubantvItem(scrapy.Item):
# define the fieldsforyour item here like:
# name=scrapy.Field()
# 导演
directors=scrapy.Field()
# 评分
rate=scrapy.Field()
# 标题
title=scrapy.Field()
# 跟进连接
url=scrapy.Field()
# 图片
cover= scrapy.Field()
然后就是编写spiders内的爬虫文件了:
编写tv.py
#-*- coding: utf-8 -*-import json
import scrapyfromdoubantv.items import DoubantvItemclassTvSpider(scrapy.Spider):
name= 'tv'allowed_domains= ['movie.douban.com'] #爬取域
offset= 0url= 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E8%A7%86%E5%89%A7&start=' #爬取的链接#格式化的url,注意逗号不要少
start_urls=(
url+str(offset),
)
#主函数
def parse(self, response):
#将相应问价转换成json形式
datas= json.loads(response.text)["data"]
#遍历数组获取内容for data indatas:
item=DoubantvItem()
# 导演
item['directors'] = data['directors']
# 评分
item['rate'] = data['rate']
# 标题
item['title'] = data['title']
# 跟进连接
item['url'] = data['url']
# 图片
item['cover'] = data['cover']
#传送到管道文件yielditem
#获取封面图片urlfor data indatas:
# 图片
image= data['cover']
#传送到管道文件yield scrapy.Request(image, callback=self.parse)
#自定义爬取响应地址数,我这里随意设置了一个20000if self.offset < 20000:
self.offset+= 20
#每次调用函数回滚,重复递归执行
yield scrapy.Request(self.url + str(self.offset), callback=self.parse)
接下来我们编写管道文件:
编写pipelines文件
import os
import urllibfromurllib.request import urlretrieveclass DoubantvPipeline(object):
#初始化响应文件,建立一个doubantv.txt文件,和一个用户存放图片的目录
def __init__(self):
self.filename= open("doubantv.txt", "wb")
self.path= "G:\images\p"self.page= 0
#没有就新建一个
ifnot os.path.exists(self.path):
os.mkdir(self.path)
#保存文件信息的函数
def process_item(self, item, spider):
print("------------------------------------------------------")
directors= item["directors"]
rate= item["rate"]
title= item["title"]
url= item["url"]
cover= item["cover"]
print("---------------------------------------------------")
#这里我们随机保存了一个内容
self.filename.write(title.encode('utf-8') + ' '.encode('utf-8') + rate.encode('utf-8') + '\r'.encode('utf-8'))
#保存图片文件到预定的目录
src= item['cover']pathname= os.path.join(self.path, str(self.page) + cover + '.jpg')try:
res=urllib.request.urlopen(src) #下载图片文件
with open(pathname,'wb') asf:
f.write(res.read())
self.page+= 1except Exceptionase:
print(e)returnitem
#关闭文件,释放内存
def colse_spider(self, spider):
self.filename.close()
然后执行爬虫文件:
在跟目录下执行
scrapy crawl tv
耐性等待片刻后。。。
去他*的世界 第二季 9.2致命女人 第一季9.3去他*的世界 第一季 9.1摩登情爱 第一季8.7鹤唳华亭7.4从前有座灵剑山7.4美国恐怖故事:1984 第九季 7.4谍战深海之惊蛰6.5请回答19889.7
。。。。。。。。。
OVER