scrapy爬取1024种子

2019-03-14 15:50:27 浏览数 (1)

1024不必多说,老司机都懂,本文介绍scrapy爬取1024种子,代码不到50行!Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。 关于scrapy用下图来说明即可(图片来自https://cuiqingcai.com/3472.html )

scrapy最好的方式通过官方文档,以及社区贡献的中文文档去学习,使用起来也非常简单,当然功能非常强大! 首先创建scrapy项目、CaoliuSpider,下面是创建的爬虫代码:

代码语言:javascript复制
# -*- coding: utf-8 -*-
import scrapy
import json
from LiosScrapy.items import CaoLiuItem
from scrapy.http.request import Request
import sys

class CaoliuSpider(scrapy.Spider):
    # 爬虫名称
    name = 'caoliu'
    # 涉及到敏感网站地址
    allowed_domains = ['网站地址']
    start_urls = ['请求地址']
    # 列表解析
    def parse(self, response):
        # 通过xpath提取
        node_list = response.xpath("//td[@class='tal']")
        next_page = response.xpath("//a[text()='下一頁']/@href").extract()[0]
        # 遍历列表获取种子名称、详情页URL
        for node in node_list:
            if not len(node.xpath('./h3/a/text()').extract()) or not len(node.xpath('./h3/a/@href').extract()):
                continue
            fileName = node.xpath('./h3/a/text()').extract()[0]
            listUrl = node.xpath('./h3/a/@href').extract()[0]
            # 通过Request meta传递参数
            yield scrapy.Request(self.allowed_domains[0]   "/"   listUrl, callback=self.parseDetail, meta={'fileName': fileName}, dont_filter=True)
        if next_page not in self.allowed_domains[0]:
            yield scrapy.Request(self.allowed_domains[0]   "/"   next_page,callback=self.parse,dont_filter=True)

    # 解析详情页
    def parseDetail(self, response):
        fileName = response.meta['fileName']
        node_list = response.xpath(
            '//a[@style="cursor:pointer;color:#008000;"]')
        for node in node_list:
            yield scrapy.Request(node.xpath('./@href').extract()[0], callback=self.parseDownLoanUrl, meta={'fileName': fileName}, dont_filter=True)
            # 默认获取第一条种子下载地址
            break

    # 拼接种子、下载
    def parseDownLoanUrl(self, response):
        fileName = response.meta['fileName']
        refNode = response.xpath("//input[@type='hidden' and @name='ref']/@value")[0].extract()
        reffNode = response.xpath("//input[@type='hidden' and @name='reff']/@value")[0].extract()
        torrentUrl = "http://www.rmdown.com/download.php?"   "ref=" str(refNode)  "&reff=" str(reffNode)
        item = CaoLiuItem()
        item['file_urls'] = torrentUrl
        item['file_name'] = fileName ".torrent"
        yield item

Item文件中的代码:

代码语言:javascript复制
class CaoLiuItem(scrapy.Item):
    # 文件名称
    file_name = scrapy.Field()
    # 指定文件下载的连接
    file_urls = scrapy.Field()
    #文件下载完成后会往里面写相关的信息
    files = scrapy.Field()

管道文件中的代码:

代码语言:javascript复制
# 继承FilesPipeline,用于下载文件
class CaoLiuPipeline(FilesPipeline):
    def get_media_requests(self, item, info):
        file_url = item['file_urls']
        meta = {'filename': item['file_name']}
        # 交给调度器发送请求
        yield Request(url=file_url, meta=meta)
    # 自定义下载文件的名称    
    def file_path(self, request, response=None, info=None):
        return request.meta.get('filename','')

记得再settings文件中添加管道、以及设置文件存储路径:

代码语言:javascript复制
ITEM_PIPELINES = {
   # 'LiosScrapy.pipelines.LiosscrapyPipeline': 300,
   'LiosScrapy.pipelines.CaoLiuPipeline': 2
}
FILES_STORE = '/Users/wenchao.wang/LiosWang/sublimetext/LiosScrapy/data/caoliu'

然后执行命令:

代码语言:javascript复制
scrapy crawl caoliu

终端输出:

打开存储文件夹,发现种子源源不断下载:

scrapy的功能非常强大,以上运用其简单爬取网页信息,作者只用于学习.最后欢迎感兴趣的朋友欢迎一起讨论学习scrapy.

0 人点赞