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上寻了一些源码来看,终于写完了第一个练手的项目






原创粉丝点击