爬爬爬!使用scrapy爬取你懂得的网站自建数据库!

爬爬爬!使用scrapy爬取你懂得的网站自建数据库!1、检查我们的scrapy版本。截至2020年11月29日,scrapy的版本为2.4.0,方法是在cmd命令行中scrapyversion如果你也与我一样,使用这个版本,那么可以确定,你可以复现我的这篇教程。2、创建项目。在cmd中scrapystartprojecttext这里我使用了text这个名字,如果你喜欢别的,也可以改成别的任何名字。如果你是新手,那么建议你还是像我一样照做,不然会在后面的代码里混淆掉。2.1创建一只爬虫。正如你在命令行中看到的提示那样,一般我们

1、检查我们的scrapy版本。截至2020年11月29日,scrapy的版本为2.4.0,方法是在cmd命令行中 scrapy version

爬爬爬!使用scrapy爬取你懂得的网站自建数据库!

如果你也与我一样,使用这个版本,那么可以确定,你可以复现我的这篇教程。

2、创建项目。在cmd中scrapy startproject text

爬爬爬!使用scrapy爬取你懂得的网站自建数据库!

这里我使用了text这个名字,如果你喜欢别的,也可以改成别的任何名字。如果你是新手,那么建议你还是像我一样照做,不然会在后面的代码里混淆掉。

2.1 创建一只爬虫。正如你在命令行中看到的提示那样,一般我们在创建完一个项目之后,马上就创建一只蜘蛛。

爬爬爬!使用scrapy爬取你懂得的网站自建数据库!

这时,我们已经完成了一只蜘蛛的创建,我们可以检查一下。使用pycharm打开这个项目,我们发现确实已经有一个example.py,这就是我们创建的蜘蛛的模块了。

爬爬爬!使用scrapy爬取你懂得的网站自建数据库!

这时,我们的准备工作算是完成了。

3、正式开始

3.1 定义我们需要的内容items.py

import scrapy
from scrapy.item import Item,Field
class TextItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = Field()  # 标题
    number = Field()  # 番号
    issuedate = Field()  # 发行时间
    actress = Field()  # 演员
    type = Field()  # 类型
    magent = Field()  # 磁力链接
    size = Field()  # 大小
    image_urls = scrapy.Field()  # 存储图片下载地址,必须是list列表形式,是下一步下载图片时图片的网页地址
    image = scrapy.Field()  # 存储图片下载地址及下载后的存储位置(相对路径)
    imagepath = scrapy.Field()  # 图片本地存储的位置
    torrent_urls = scrapy.Field()
    torrent = scrapy.Field()
    torrent_magnet = scrapy.Field()
    pass

 

3.2 编写蜘蛛。example.py

import scrapy
from text.items import TextItem  # 此处如果报错是pyCharm的原因
from scrapy.http import Request

class ExampleSpider(scrapy.Spider):
    name = 'example'
    allowed_domains = ['bbs.xxxxxxxx.site']#抱歉这里是某网站的域名
    start_urls = [
        'https://xxxxxxxxxx',#抱歉这里是某网站的地址:)
    ]

    def parse(self, response):
        book_urls = response.xpath('//td/a[@class="subject"]/@href').extract()
        for book_url in book_urls:
            book_url ="https://bbs.ojxqsc.site/2048/" + book_url
            yield Request(book_url, callback=self.parse_read)

    def parse_read(self, response):
        title = str(response.xpath('//td[@class="tal h"]/text()').extract_first()).replace("\n主题 : 【新片原档首发】 ","")
        title = title.replace("\n","")
        title = title.replace("主题 : ","")
        title = title.replace("/", "")
        if (str(response.xpath('//div[@class="f14"]/text()').extract()).find('品番: ') >= 0):
            number = str(response.xpath('//div[@class="f14"]/text()').extract()).split('品番: ')[1].split("'")[0]
        else:
            number = 'null'
        if (str(response.xpath('//div[@class="f14"]/text()').extract()).find('影片容量:') >= 0):
            size =str(response.xpath('//div[@class="f14"]/text()').extract()).split('影片容量:')[1].split("'")[0]
        else:
            size ='null'
        if (str(response.xpath('//div[@class="f14"]/text()').extract()).find('発売日: ') >= 0):
            issuedate=str(response.xpath('//div[@class="f14"]/text()').extract()).split('発売日: ')[1].split("'")[0]
        else:
            issuedate='null'
        if (str(response.xpath('//div[@class="f14"]/text()').extract()).find('出演者: ')>=0):
            actress=str(response.xpath('//div[@class="f14"]/text()').extract()).split('出演者: ')[1].split("'")[0]
        else:
            actress = 'null'
        if(str(response.xpath('//*[@id="read_tpc"]/img/@src').extract_first())!="None"):
            print("筛选图片地址:"+str(response.xpath('//*[@id="read_tpc"]/img/@src').extract_first()))
            image = response.xpath('//*[@id="read_tpc"]/img/@src').extract_first()
        else:
            image = response.xpath('//*[@id="read_tpc"]/a[1]/img/@src').extract_first()  # 图片地址

        torrent_urls = response.xpath('//*[@id="read_tpc"]/a/@href').extract()
        for torrent_url in torrent_urls:
            print("所有的网址是:"+str(torrent_url))
            if("download" in str(torrent_url)):
                print("现在的网址是:" +str(torrent_url))
                yield Request(torrent_url, meta = {'image_urls':[image],'title':title,'number':number,'size':size,'issuedate':issuedate,'actress':actress},callback=self.parse_magnet, dont_filter=True)
            else:
                print("oh no!")
    def parse_magnet(self, response):
        torrent_magnet = response.xpath('//*[@class="uk-button "]/@href').extract_first()  # 图片地址
        print("现在的种子的内容是:" + str(torrent_magnet))
        item = TextItem()
        item['image_urls'] = response.meta['image_urls']
        item['title'] = response.meta['title']
        item['number']=response.meta['number']
        item['size'] = response.meta['size']
        item['issuedate'] = response.meta['issuedate']
        item['actress'] = response.meta['actress']
        print("图片地址:" + str(item['image_urls']))
        print("文件路径:" + str(item['title']))
        imagepath = str(response.meta['title'])
        item['imagepath'] = "G:\GOO\\"+ imagepath+".jpg"
        item['torrent_magnet'] = str(torrent_magnet)
        yield item

3.3 编写管道 pipelines.py

from scrapy.pipelines.images import ImagesPipeline
from scrapy.http import Request
import pymysql.cursors

class TextPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield Request(image_url, meta={'mid_item': item['title']})
    def file_path(self, request, response=None, info=None):
        title = request.meta['mid_item']+".jpg"
        print("现在的标题是:"+title)
        return title
class MySQLPipeline(object):
    def __init__(self):
        # 连接数据库
        self.connect = pymysql.connect(
            host='127.0.0.1',  # 数据库地址
            port=3306,  # 数据库端口
            db='liab',  # 数据库名
            user='root',  # 数据库用户名
            passwd='123456',  # 数据库密码
            charset='utf8',  # 编码方式
            use_unicode=True)
        # 通过cursor执行增删查改
        self.cursor = self.connect.cursor()
    def process_item(self, item, spider):
        self.cursor.execute(
            """insert into code(title,number,size,issuedate,actress,imageurl,torrentmagnet)
            value (%s,%s,%s,%s,%s,%s,%s)""",  # 纯属python操作mysql知识,不熟悉请恶补
            (item['title'],
             item['number'],
             item['size'],
             item['issuedate'],
             item['actress'],
             item['imagepath'],# item里面定义的字段和表字段对应
             item['torrent_magnet'],  # item里面定义的字段和表字段对应
            ))
        # 提交sql语句
        self.connect.commit()
        return item  # 必须实现返回

3.4 编写设置 setting.py

BOT_NAME = 'text'
SPIDER_MODULES = ['text.spiders']
NEWSPIDER_MODULE = 'text.spiders'
HTTPERROR_ALLOWED_CODES = [403]
HTTPERROR_ALLOWED_CODES = [404]
ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {
   'text.pipelines.TextPipeline': 1,
   'text.pipelines.MySQLPipeline': 300,
}

到这里,我们的项目就结束了。简单说一下它的功能。第一是将封面下载到本地。第二是将其他字段保存在本地的数据库中,封面图片在数据库中的保持方式为图片的地址,而不是图片的数据流。

4、让我们测试一下!

4.1 项目的启动。我们可以在pycharm中的terminal窗口键入scrapy crawl example 

爬爬爬!使用scrapy爬取你懂得的网站自建数据库!

也可以在cmd窗口中使用相同的方法启动。

4.2 你可以在你的保存目录中找到这些图片。并且,你也可以在数据库中找到这些数据。

爬爬爬!使用scrapy爬取你懂得的网站自建数据库!

如果有什么地方不懂,欢迎留言或私信!

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36247.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注