本文开发环境:ubuntu16.04 + scrapy1.5 + python3.5 + pycharm2017.03

scrapy学习也有段时间了,刚开始也是跟着视屏一点点学习,看着挺简单的,到了动手的时候就不知道如何下手。现在通过一个小案例来总结下如何使用,如果能帮到你那我就很欣慰了。

必备技能:

  • python基础 推荐廖雪峰python教程
  • 网页基础 W3Cschool
  • xpath 推荐W3Cschool Xpath教程

正文

我们来看看电影天堂的网站结构。我们进入最新电影。

这里可以看到这里有很多电影,我们看到总共有173页。

光有下载连接可不行,我们还要电影的名称和上传时间。
下面看看怎么提取。
先回到第一页,然后CTRL + shift + X打开xpath helper,在电影名称上面右键–检查—copy–copy xpath,粘贴入Query那一栏,单击,看看是不是取到了名称,哈哈。

但是只是取到了一个,我们要这一页的全部名称,而且这么长的xpath表达式看着一点也不优雅。我们我们来修改下。
通过观察,我们所需要的内容是在一个<div class="co_content8">里面的。

所以,我们的xpath规则可以写成(名称

//div[@class='co_content8']/ul/table//a/text()

是不是都取到了电影名称。哈哈。同理上传日期

//div[@class='co_content8']/ul/table//tbody//font/text()

名称和时间都取到了,让我们看看怎么取每部电影的下载地址。进入详情页。打开xpath helper,F12进入调试模式。可以看到有两个下载地址。既然这样,那就全要了。
FTP:

//tbody//td[@style="WORD-WRAP: break-word"]//a/@href[0]

迅雷:

//tbody//td[@style="WORD-WRAP: break-word"]//a/@href[1]

现在我们已经取到第一页的数据,那如何跟进取到后面所有页的数据呢?一种办法是在第一页取到下一页的链接,然后进入下一页取数据。当然有第二种方法。我们右键查看源代码的时候,鼠标拉到最下边,可以看到:

<option value='list_23_1.html' selected>1</option>
<option value='list_23_2.html'>2</option>
<option value='list_23_3.html'>3</option>

这里列出了全部页面的链接。只要我们取到value的值,就可以遍历所有的页面了,哈哈,是不是很方便?电影天堂详情页虽然乱七八糟,但一点还是很赞的。
那我们怎么取到value的值,一样的。

这里注意一下,有些xpath规则在xpath helper里面正常,但到了scrapy就不行。原因就是在浏览器加载页面的时候帮我们优化了,而scrapy取到的是网页源代码。这就是个坑。所以,提取规格的时候要在scrapy shell验证好。

取全部页面链接的xpath规则:

//table//b/a/@href

好了,现在我们就可以开始写代码了。

在命令行中:

scrapy startproject Dianying

然后使用scrapy创建默认spider文件:

scrapy genspider dytt "www.ygdy8.net"

我的目录结构是这样的:

1. 编写要爬取的内容items.py


import scrapyclass DianyingItem(scrapy.Item): # 电影标题title = scrapy.Field()# 上传时间release_date = scrapy.Field()# 电影详情页url = scrapy.Field()# 电影下载链接FTPdownload_link = scrapy.Field()# 迅雷下载链接thunder_download_link = scrapy.Field()

2. 编写爬虫文件

# -*- coding: utf-8 -*-
import scrapy
# 导入item类
from Dianying.items import DianyingItemclass DyttSpider(scrapy.Spider):# 爬虫名name = 'dytt'# 爬虫爬取的域allowed_domains = ['www.ygdy8.net']# 爬取页面链接start_urls = ['http://www.dytt8.net/html/gndy/dyzz/list_23_1.html']# 解析函数def parse(self, response):# 定义一个列表存放itemsitems = []# 取全部标题,转化为列表title = response.xpath('//table//b/a/text()').extract()# 取全部上传时间,转化为列表release_date = response.xpath('//table//font/text()').extract()# 取全部详情页的链接url = response.xpath('//table//b/a/@href').extract()# 遍历列表,将结果存入itemsfor i in range(0, len(title)):# 实例化一个item类,然后将结果全部存入itemsitem = DianyingItem()item['title'] = title[i]item['release_date'] = release_date[i]# 拼接URL,获取所有电影详情的URL,拼成完整的URL来访问地址item['url'] = 'http://www.dytt8.net' + url[i]items.append(item)# 如果parse函数没有解析完成,可以将结果存为字典春给meta变量,交给parse_download_link继续解析for item in items:yield scrapy.Request(url=item['url'], meta={'meta': item}, callback=self.parse_download_link)# 这个是下一页跟进,从第二页开始,因为第一页我们已经爬过了。next_urls = response.xpath('//select[@name="sldd"]/option/@value').extract()[2:]for next_url in next_urls:yield response.follow(next_url, callback=self.parse)# 这个函数进入详情页获取下载地址def parse_download_link(self, response):# 先获取parse函数解析的结果item = response.meta['meta']# 取到下载链接,实际上这里有两个download_link = response.xpath('//tbody//td[@style="WORD-WRAP: break-word"]//a/@href').extract()# 有些电影是没有下载地址的,所以要判断一下,有的才继续下一步。if len(download_link) is not None:# 首先获取到FTP的地址item['download_link'] = download_link[0]# 有些是没有迅雷下载地址的,所以要判断一下,没有thunder_download_link就为空,不然会报错。if len(download_link) == 2:item['thunder_download_link'] = download_link[1]else:item['thunder_download_link'] = ''# 现在我们已经拿到全部数据了,可以把item返回了。yield item
  • name = “” :爬虫名称,必须唯一。
  • allow_domains = [ ] :定义搜索域名范围。
  • start_urls = () :爬取的URL元祖/列表。
  • parse(self, response) :解析函数:提取数据&生成下一页链接。
    我们来看URL链接,刚进来是这样的:
http://www.ygdy8.net/html/gndy/dyzz/index.html

我们点击第二页,第三页:

http://www.ygdy8.net/html/gndy/dyzz/list_23_2.html
http://www.ygdy8.net/html/gndy/dyzz/list_23_3.html

发现规律了吧,实际上就是list_23_xx的xx数字在变,要爬第一页打就是:

http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html

和刚进来的页面是一样的。只要在代码里面拼接URL就可以了。

3. 编写pipelines.py
现在我们拿到数据了,可以将结果保存为各种形式。

  • 保存为json文件:
import codecs
# 导入json模块
import jsonclass DianyingPipeline(object):# 初始化函数,创建json文件,指定编码格式def __init__(self):self.filename = codecs.open('dytt.json', 'w', encoding='utf-8')# 将item写入,在结尾增加换行符def process_item(self, item, spider):content = json.dumps(dict(item), ensure_ascii=False) + '\n'self.filename.write(content)# 解析一个存一个,返回item继续跟进return item# 爬问后就把文件关了,释放资源def spider_close(self, spider):self.filename.close()

写好pipelines.py后还要在setting.py文件注册一下才能起作用。
当然我们也要把USER-AGENT设置下,还有爬取时间,尊重下网站维护人员,哈哈。



好了,现在可以跑起我们的爬虫了,命令行输入:

scrapy crawl dytt

如果没有报错,结果:

4000多行,哈哈。

  • 保存为excel文件
    保存excel要安装一个python库:
sudo pip install OpenPyxl

新建Item_to_xlsx.py文件

代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# 导入模块
from openpyxl import Workbookclass Item_to_xlsx(object):def __init__(self):# 先实例化一个class对象self.wb = Workbook()# 激活工作表self.ws = self.wb.active# 添加一行数据,就是excel表的第一行,标记这一列的作用self.ws.append(['名称', '收入时间', '地址详情', '下载链接', '迅雷下载链接'])# 下面就是把数据写入表中啦def process_item(self, item, spider):line = [item['title'], item['release_date'], item['url'], item['download_link'], item['thunder_download_link']]self.ws.append(line)self.wb.save('/home/lucky/dytt.xlsx')

写完后,还是要在setting.py文件中注册下,实际上上面的图中已经给出了,只是我把它注释掉了,将它打开就行。注意如果既要保存为json,又要保存excel,就把它后面的数字改一下顺序,数据越小越优先。
跑起来:

scrapy crawl dytt

来看下成果:

也是4000多行,首行也有了我们定义的名字。哈哈。

  • 保存进MySQL数据库
    首先得保证你的系统已经安装了MySQL,还要安装python相关库:
sudo pip install pymysql

在setting.py文件末尾定义MySQL相关配置项:

# 端口
MYSQL_HOST = 'localhost'
# 数据库名称,根据自己的情况定义
MYSQL_DBNAME = 'xxx'
# 用户,根据自己的情况定义
MYSQL_USER = 'xxx'
# 密码,根据自己的情况定义
MYSQL_PASSWD = 'xxx'

新建DBinfo_pipeline.py文件:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# 导入模块
import pymysql
# 导入setting文件
from Dianying import settingsclass DBinfo_pipeline(object):# 获取seting文件的设置,并连接数据库def __init__(self):self.connect = pymysql.connect(host=settings.MYSQL_HOST,db=settings.MYSQL_DBNAME,user=settings.MYSQL_USER,passwd=settings.MYSQL_PASSWD,charset='utf8',use_unicode=True)self.cursor = self.connect.cursor()# 下面就是和数据库插入有关的命令了,如果不熟悉,建议学习下mysqldef process_item(self, item, spider):try:self.cursor.execute('''insert into dytt_info(title, release_date, url, download_link, thunder_download_link)value(%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE download_link=VALUES(download_link), thunder_download_link=VALUES(thunder_download_link)''',(item['title'],item['release_date'],item['url'],item['download_link'],item['thunder_download_link']))self.connect.commit()except Exception as error:print(error)return item

好了,写完了,在setting文件中注册下,跑起来:

scrapy crawl dytt

用navicat看下:

收工。

总结:
scrapy是python网络爬虫框架。
使用它首先确定要爬取的内容,然后用xpath helper匹配出xpath规则,其实不只xpath,还可以用css选择器,beautiful soul等提取页面内容,这里就只用xpath,希望能够起到抛砖引玉的作用。
接下来就是数据的保存了,可以保存为各种格式。scrapy已经为我们提供好了,别打我,我只是想让你多学一点,哈哈。

# json格式,默认为Unicode编码
scrapy crawl dytt -o dytt.json# json lines格式,默认为Unicode编码
scrapy crawl dytt -o dytt.jsonl# csv 逗号表达式,可用Excel打开
scrapy crawl dytt -o dytt.csv# xml格式
scrapy crawl dytt -o dytt.xml

还有就是setting.py文件中的配置,设置爬取间隔,设置USER-AGENT,还有设置IP池等,大家慢慢研究了。
所谓师傅带进门,修行靠个人。希望这篇文章对你有帮助。

over。

scrapy入门小案例--爬取电影天堂最新电影下载地址相关推荐

  1. 爬取电影天堂最新电影(xpath结合lxml)

    完整代码 import requests from lxml import etree from openpyxl import WorkbookBASEURL='https://www.dytt8. ...

  2. 爬取电影天堂最新电影的名称和下载链接

    此次的目标是爬取电影天堂最新200页的最新电影的电影名称和下载链接,电影的下载链接在二级页面,所以需要先匹配一级页面的所有链接,然后逐个请求二级页面,代码如下: """爬 ...

  3. 【宅男宅女们的福音】电影天堂最新电影爬取及搜索脚本

    多线程电影天堂最新资源爬取脚本.电影搜索脚本 PS:方便大家使用写到了HTML中生成表格. 线程可以在脚本里直接改,测试线程为30时IP可能会被限制访问.[阳光电影是电影天堂的马甲] 环境: Pyth ...

  4. Scrapy电影天堂最新电影信息爬取

    环境:python 2.7 创建scrapy项目过程可见本人博客其他文章,这里不再赘述 直接上代码 主要代码 # -*- coding: utf-8 -*- import scrapyclass Dy ...

  5. Scrapy入门实例_爬取美剧天堂的最新前100

    使用工具:Python3.6版本 Python官网:https://www.python.org/ 目录 Scrapy的安装 Scrapy爬取数据步骤 一.创建工程: 二.创建爬虫程序 三.编辑爬虫 ...

  6. 人生苦短,用Python爬取迅雷电影天堂最新电影ed2k

    第一步仍然是创建scrapy项目与spider文件 切换到工作目录两条命令依次输入 scrapy startproject xunleidianying scrapy genspider xunlei ...

  7. Scrapy框架的学习(2.scrapy入门,简单爬取页面,并使用管道(pipelines)保存数据)

    上个博客写了:  Scrapy的概念以及Scrapy的详细工作流程 https://blog.csdn.net/wei18791957243/article/details/86154068 1.sc ...

  8. python下载电影天堂_【PY】没有电影看?来教你用Python爬取电影天堂最新电影!...

    项目开始 第一步仍然是创建scrapy项目与spider文件 切换到工作目录两条命令依次输入 scrapy startproject xunleidianying scrapy genspider x ...

  9. Python爬虫(二)——爬取电影天堂,保存下载地址

    首先我们开始要分析一下,下载种子我们需要哪几步: 获取所有电影页的访问地址 获取电影页源码 提取出下载地址 将下载地址保存 首先第一步,我们来分析一下电影天堂网站的结构,发现他跟我们的古诗文网还是非常 ...

  10. 爬虫小案例-爬取当当网TOP500的图书并将数据存入数据库

    在这里分享一个刚刚学习爬虫时自己做的一个小案例,爬取了当当网TOP500的图书信息,包括图书名称.作者名称和出版社的名称. 1.分析网页 url:http://bang.dangdang.com/bo ...

最新文章

  1. InteWidgetTookit现有三个控件的使用方法
  2. Hyper-V 性能加速之VMQ
  3. MYSQL----(3)SQL 基本操作
  4. vs2015 + opencv3.4.0 + qt msvc2015_64-5.7.1 显示图像
  5. Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源代码实现
  6. [转贴]一个农村高考落榜生的心路历程
  7. BP神经网络用于预测
  8. python第三方库文件传输助手_Python与微信——itchat包
  9. 估计值与平均值的离差平方和_各变量值与其算术平均数的离差平方之和为()
  10. C++ 解决经典哥尼斯堡七桥问题
  11. linux chmod 777 dev,ubuntu – 撤消chmod 777
  12. resttemplate 发送get请求
  13. 关于发布app报90096错误,iPhone5启动图片报错
  14. 统计地铁一号线站点Python
  15. 大数据医疗正进入信息共享
  16. ACL会议介绍 - Call for Main Conference Papers
  17. css多栏布局(双栏布局、三栏布局、圣杯布局、双飞翼布局)
  18. 插序计Spider.Financial.NumXL.v1.65.42892.1.Win32_64 2CD确准
  19. Django实战(9)——为人脸识别系统添加随机抽签功能
  20. 华为交换机dot1x配置认证方式

热门文章

  1. 服务器虚拟化 lpar,HMC与VIOS对新LPAR提供存储与网络虚拟化的支持
  2. COOC2.0一键做邻接表(多元组)+共现矩阵+相异矩阵+频次统计
  3. mysql替换后的zzigu_MySQL导入数据报错Got a packet bigger than‘max_allowed_packet’bytes错误的解决方法...
  4. git 工作区、暂存区、版本库(本地)、远程版本库区别
  5. vue加载vue-amap 报错解决办法
  6. latex 显示黑色的点命令 black dot.
  7. ArrayList的使用方法
  8. 用户分类以及用户活跃度的衡量方法
  9. R语言中 attach()与detach(),及with()的使用
  10. 控制台Tomcat Locahost log输出No Spring WebApplicationIn