Scrapy 入门项目
来源:互联网 发布:炫浪网络社区发书区 编辑:程序博客网 时间:2024/06/05 06:40
这些日子在学习 Scrapy 框架,花了好多时间,框架刚开始入门总是费劲的,而且网上的Scrapy相关博客所用的Scrapy框架版本与我的都不尽相同,Scrapy文档最新版的也是全英文,看着有些累,.不过好得写出了个入门的项目
我想要爬取的是电影天堂最新电影页面下,所有分页中 电影的名字 信息 以及下载地址等
http://www.ygdy8.net/html/gndy/dyzz/index.html
和之前使用的reques库和BeautifulSoup4 库类似,
首先都需要分析网页页面元素
首先设置start_urls的值
start_urls={ 'http://www.ygdy8.net/html/gndy/dyzz/index.html', }
接下来利用返回的response进行具体的分析一 提取出下图中 各个电影详情页的链接,以及 电影的名字
经过仔细观察之后发现 所有的 电影名字 以及链接 都一个 <a>标签且 class属性为"ulink"的节点中,并且所有符合条件的a节点,都只包含电影信息没有其他无关信息,因此不需要筛选
利用如下代码可以得到想要的电影名字 以及 电影详情页地址
_list = response.xpath('//a[@class="ulink" ]')for i in _list: name = i.xpath("./text()").extract()[0] url ='http://www.ygdy8.net'+ i.xpath("@href").extract()[0]
然后 利用解析得到的信息 迭代Request请求
以下为 解析这个页面的parse函数
def parseFilmLink(self, response): _list = response.xpath('//a[@class="ulink" ]') for i in _list: name = i.xpath("./text()").extract()[0] url ='http://www.ygdy8.net'+ i.xpath("@href").extract()[0] yield Request(url=url, meta={'name': name}, callback=self.parseFilmInfo, dont_filter=True,encoding='utf-8')
二 在电影详情页中 解析得到 电影的相关信息 以及下载地址等
http://www.ygdy8.net/html/gndy/dyzz/20171021/55329.html
以这个电影详情页为例
CTRL+U 查看网页源代码,搜索信息中的相关任意信息,发现在源码中可以找到,说明不是异步加载得到的,可以直接解析response获得信息
发现
所有需要的信息 都在span[style="FONT-SIZE" 节点中,继续进行结构分析,可以获得解析数据的XPATH表达式 如下:
_text = response.xpath('//span[@style="FONT-SIZE: 12px"]/../td/text()').extract()downloadUrl = response.xpath('//span[@style="FONT-SIZE: 12px"]/../td//td/a/text()').extract()[0]
先定义items.py中 item项为:
class FilmspiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() name=scrapy.Field() Info=scrapy.Field() downloadUrl=scrapy.Field()
然后对item赋值,并yield至pipeline
name = response.meta['name']_text = response.xpath('//span[@style="FONT-SIZE: 12px"]/../td/text()').extract()downloadUrl = response.xpath('//span[@style="FONT-SIZE: 12px"]/../td//td/a/text()').extract()[0]item= FilmspiderItem()item['name']= nameitem['downloadUrl']=downloadUrlitem['Info']=_textyield item
在pipelines.py中, 保存 解析后的网页数据 至本地
class FilmspiderPipeline(object): def process_item(self, item, spider): with open('E:/film/' + item['name'] + '.txt', 'a+', encoding='utf-8') as f: for i in item['Info']: f.write(i) f.write("下载地址:" + item['downloadUrl']) f.close() return item同时 千万不要忘记, 将settings.py中 修改Piieline的相关设置
三 爬取第二页.第三页等后面所有页面
在最开始的页面中 ,发现有下一页按钮, 那么 可以在源代码中搜索"下一页"文本,查看相关节点信息
发现下一页的url就保存在文本为 "下一页"的<a>节点中的herf属性
因此下一页的url为:
nextPage= 'http://www.ygdy8.net/html/gndy/dyzz/'+response.xpath('//a[text()="下一页"]/@href').extract()[0]以此url返回一个Request,其中 回调函数为自身.
综上
最后的parseFilmLink函数为
def parseFilmLink(self, response): _list = response.xpath('//a[@class="ulink" ]') for i in _list: name = i.xpath("./text()").extract()[0] url ='http://www.ygdy8.net'+ i.xpath("@href").extract()[0] yield Request(url=url, meta={'name': name}, callback=self.parseFilmInfo, dont_filter=True,encoding='utf-8') nextPage= 'http://www.ygdy8.net/html/gndy/dyzz/'+response.xpath('//a[text()="下一页"]/@href').extract()[0] yield Request(url=nextPage,callback=self.parseFilmLink, headers=self.headers,dont_filter=True)
完成所有的代码后 在cmd中运行这个爬虫项目
爬取下来的成果如图
完整代码:
github地址
总结:初次上手一个新的库 新的框架,如果以前没有相似的经历,有时候可能会摸不着头脑.这时候 我想就应该多去github上搜一些实际项目的源码来 理解>
我本来也是看了好久的文档(英文文档 有点难以上手),因为 Scarapy文档太长,需要兼顾许多方面等的原因,无法形成一个完整的概念.,一直不知道从何入手,
最后还是从Github上寻了一些源码来看,终于写完了第一个练手的项目
- Scrapy 入门项目
- Scrapy入门(二)创建Scrapy项目
- 【scrapy】学习Scrapy入门
- Scrapy入门--Scrapy是什么
- <scrapy>scrapy入门学习
- 【scrapy】学习Scrapy入门
- Scrapy入门
- scrapy入门
- Scrapy入门
- Scrapy入门
- Scrapy入门
- Scrapy入门
- scrapy入门
- Scrapy 入门
- scrapy入门
- scrapy 入门
- scrapy入门
- 爬虫系列2:scrapy项目入门案例分析
- 最大特斯拉超充站落户上海 中国AI学会公布首批会士名单
- 对话 | 华为朱平:AI技术让手机满足千人千面需求
- 讯飞1024计划公布 砸下10.24亿豪赌人工智能【附现场PPT】
- ubuntu开机启动碰到need at least a destination address问题
- 添加CGAL库进EKClothSynthesis工程
- Scrapy 入门项目
- 【libevent】源码学习(一)--开篇
- 关于maven出现Missing artifact oracle:ojdbc14:jar:10.2.0.4.0错误的问题解决办法
- C语言八皇后冲突问题
- SQL--动态列名
- 第七周 项目2
- 2017年10月24日 一些小感想
- tar命令详解及使用实例
- Ubuntu 16.04下解决sublime text3无法输中文问题