我们现在已经了解了 Scrapy 框架的基本运作方式和怎么样使用 Xpath 语言来解析网站了,这次让我们来写一个真正的爬虫,并将它爬取到的数据分别保存到本地中,没错依旧是我们的老本行,利用爬取下的数据更新我们的微信公众号看电影的后台数据,现在就开始吧!
这次我们要爬取的网站是这个,我直接跳转到电影区域来了,所以会比较长:
http://nlook1.cn/index.php?s=/vod-type-id-1-type--area--year--star--state--order-addtime.html
我们要爬取的信息是:电影名称,电影图片,电影跳转链接。
Scrapy 框架的实施:
创建 scrapy 项目和爬虫:
创建项目,cmd 到终端里面,进入你需要放置项目的目录,使用下面的命令创建项目,你可以改变你的项目名称,我这里用的是 dingdian :
scrapy startproject dingdian
这样项目就创建完毕了,我用的是 Pycharm ,所以现在打开我们的 Pycharm 开始我们的爬虫之旅了,每个文件的作用在上一篇文章已经和大家详细的介绍过了,不怎么明白的可以再回去看看,这里我就不再啰嗦了!
在开始之前给大家一个小技巧,Scrapy 默认是不能在 IDE 中调试的,我们在根目录中新建一个py文件叫:entrypoint.py 在里面写入以下内容:
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'dingdian'])
注意!第二行中代码中的前两个参数是不变的,第三个参数请使用自己的spider 的名字也就是刚才你创建项目的名称,现在整个 Scrapy 框架是这样子的。
编写items.py:
现在我们来先编写 items.py ,十分的简单,只需要将希望获取的字段名填写进去,比如我们先要爬取的数据是,电影名称,电影图片,电影跳转链接,我们直接写进去就可以了,不用管其他的:
是不是特别的简单,下面开始重点了哦!编写 spider(就是我们用来提取数据的爬虫了)
编写 Spider:
在 spiders 文件中新建一个 dingdian.py 文件并导入我们需用的模块,并且将每一页的 url 存放在到一个列表之中,每一行我都有详细的解析,相信只要大家仔细看,是一定能够看明白的!
# -*- coding: utf-8 -*-
import scrapy #导入 scrapy 包
from dingdian.items import DingdianItem # 将 item 导入进来,这样数据才能在各个模块之间流转(导入 dingdian 项目中 items 文件中的 DingdianItem 类)
class Myspider(scrapy.Spider):
name = 'dingdian' # 请注意,这name就是我们在 entrypoint.py 文件中的第三个参数!
base_url = 'http://nlook1.cn/index.php?s=/vod-type-id-1-type--area--year--star--state--order-addtime-p-'
baseurl = '.html' # 这两个 url 是为了之后的爬虫翻页处理
start_urls = [] # 建立需要爬取信息的 url 列表
for i in range(160): # 从第一页开始到 160 页,使用字符串拼接的方式实现了我们需要的全部 URL
url = base_url + str(i) + baseurl
start_urls.append(url)
我们使用 Xpath 语法来提取我们所需的信息,不怎么清楚这个语法的也可以在公众号里查看我的上一篇介绍 Xpath 的文章,这里我就直接解析网站上手用了。
需要的信息我全部用箭头标记出来了,我们进行网站解析就可以了,请看代码内容,每一行我都有详细的代码解析。
# 刚上路的新手可能会想,这个函数到底是干嘛的,这个函数其实是 Scrapy 处理下载的 response 的默认方法,我们直接用就好了
def parse(self, response):
lists = [] # 先建立一个列表,用来保存每一页的信息
# 通过观察我们看到该页面所有影片的信息都位于一个class属性为list-unstyled vod-item-img ff-img-215的 ul 标签内的 li 标签内。
movies = response.xpath('//ul[@class="list-unstyled vod-item-img ff-img-215"]/li')
for movie in movies:
list = DingdianItem() # 申请一个weatheritem 的类型来保存结果
# 为什么要用.extract()[0],是因为.xpath 返回的是一个列表,我们是获取里面的内容
list['name'] = movie.xpath('.//p[@class="image"]//img/@alt').extract()[0]
list['img'] = movie.xpath('.//p[@class="image"]//img/@data-original').extract()[0]
list['movie'] = 'http://nlook1.cn' + movie.xpath('.//p[@class="image"]/a/@href').extract()[0]
lists.append(list) # 添加到 lists 列表中
return lists # 一定要有这个返回 lists ,因为之后我们要将数据下载到本地,没有的话,就下载保存不了的
编写 pipelines.py
我们编写 pipelines.py 来处理 spider爬到的内容,这里有几个非常重要的注意事项,请大家一定要注意,否则都会导致你的数据无法保存到本地。
1、爬虫文件 parse() 函数一定要有 return 语句
2、pipelines.py 文件正确配置
3、修改 settings.py 文件
将下列部分的注释去掉:
#ITEM_PIPELINES = {
# 'dingdian.pipelines.DingdianPipeline': 300,
#}
ITEM_PIPELINES = {
'dingdian.pipelines.DingdianPipeline': 300,
}
现在我们就可以来写 pipelines.py 文件的代码了,非常的简单,但是一定要注意上面的注意事项,否则是无法保存成功的!
class DingdianPipeline(object):
def process_item(self, item, spider):
with open('C:\\Users\\lec\\Desktop\\456.txt','a') as f:
f.write("{},,{},{}\n".format(item['name'],item['img'],item['movie']))
最后我们运行 entrypoint.py 文件就大功告成了,费了这么大劲搞这个 Scrapy 爬虫框架究竟有什么好处呢,没错,只有当你在运行的那一瞬间,你就会发现它是有多么的快,160 页的数据不到一分钟就采集完毕了,相比之前的方法,这个简直是不知道快了多少,这就是 Scrapy 异步框架的强大!
效果图:
参考文章:静觅 » 小白进阶之Scrapy第一篇
PS: Scrapy 框架是真的强大,爬虫运行的时候我真想录下来与大家分享它的速度,就是可惜公众号不能随便插入视频。
如果觉得文章还不错的话,还请大家点赞分享下。算是对「fightjiang」最大的支持!
每 天 分 享 Python 干 货