前期准备,首先要有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 scrapy class DoubantvItem(scrapy.Item): # define the fields for your 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 scrapy from doubantv.items import DoubantvItem class TvSpider(scrapy.Spider): name = 'tv' allowed_domains = ['movie.douban.com'] #爬取域 offset = 0 url = '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 in datas: item = DoubantvItem() # 导演 item['directors'] = data['directors'] # 评分 item['rate'] = data['rate'] # 标题 item['title'] = data['title'] # 跟进连接 item['url'] = data['url'] # 图片 item['cover'] = data['cover'] #传送到管道文件
yield item
#获取封面图片url for data in datas: # 图片 image = data['cover']
#传送到管道文件 yield scrapy.Request(image, callback=self.parse)
#自定义爬取响应地址数,我这里随意设置了一个20000 if self.offset < 20000: self.offset += 20
#每次调用函数回滚,重复递归执行 yield scrapy.Request(self.url + str(self.offset), callback=self.parse)
接下来我们编写管道文件:
编写pipelines文件 import os import urllib from urllib.request import urlretrieve class DoubantvPipeline(object):
#初始化响应文件,建立一个doubantv.txt文件,和一个用户存放图片的目录 def __init__(self): self.filename = open("doubantv.txt", "wb") self.path = "G:\images\p" self.page = 0
#没有就新建一个 if not 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') as f: f.write(res.read()) self.page += 1 except Exception as e: print(e) return item #关闭文件,释放内存 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 请回答1988 9.7
。。。。。。。。。
OVER