发布时间:2025-12-10 19:12:02 浏览次数:10
爬爬爬!使用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
如果你也与我一样,使用这个版本,那么可以确定,你可以复现我的这篇教程。
2、创建项目。在cmd中scrapy startproject text
这里我使用了text这个名字,如果你喜欢别的,也可以改成别的任何名字。如果你是新手,那么建议你还是像我一样照做,不然会在后面的代码里混淆掉。
2.1 创建一只爬虫。正如你在命令行中看到的提示那样,一般我们在创建完一个项目之后,马上就创建一只蜘蛛。
这时,我们已经完成了一只蜘蛛的创建,我们可以检查一下。使用pycharm打开这个项目,我们发现确实已经有一个example.py,这就是我们创建的蜘蛛的模块了。
这时,我们的准备工作算是完成了。
3、正式开始
3.1 定义我们需要的内容items.py
import scrapyfrom scrapy.item import Item,Fieldclass 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 scrapyfrom text.items import TextItem # 此处如果报错是pyCharm的原因from scrapy.http import Requestclass ExampleSpider(scrapy.Spider): name = 'example' allowed_domains = ['bbs.xxxxxxxx.site']#抱歉这里是某网站的域名 start_urls = [ 'https://xxxxxxxxxx',#抱歉这里是某网站的地址:) ] def parse(self, response): book_urls = response.xpath('//td/a[@]/@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[@]/text()').extract_first()).replace("\n主题 : 【新片原档首发】 ","") title = title.replace("\n","") title = title.replace("主题 : ","") title = title.replace("/", "") if (str(response.xpath('//p[@]/text()').extract()).find('品番: ') >= 0): number = str(response.xpath('//p[@]/text()').extract()).split('品番: ')[1].split("'")[0] else: number = 'null' if (str(response.xpath('//p[@]/text()').extract()).find('影片容量:') >= 0): size =str(response.xpath('//p[@]/text()').extract()).split('影片容量:')[1].split("'")[0] else: size ='null' if (str(response.xpath('//p[@]/text()').extract()).find('発売日: ') >= 0): issuedate=str(response.xpath('//p[@]/text()').extract()).split('発売日: ')[1].split("'")[0] else: issuedate='null' if (str(response.xpath('//p[@]/text()').extract()).find('出演者: ')>=0): actress=str(response.xpath('//p[@]/text()').extract()).split('出演者: ')[1].split("'")[0] else: actress = 'null' if(str(response.xpath('//*[@]/img/@src').extract_first())!="None"): print("筛选图片地址:"+str(response.xpath('//*[@]/img/@src').extract_first())) image = response.xpath('//*[@]/img/@src').extract_first() else: image = response.xpath('//*[@]/a[1]/img/@src').extract_first() # 图片地址 torrent_urls = response.xpath('//*[@]/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('//*[@]/@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 item3.3 编写管道 pipelines.py
from scrapy.pipelines.images import ImagesPipelinefrom scrapy.http import Requestimport pymysql.cursorsclass 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 titleclass 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 = TrueITEM_PIPELINES = { 'text.pipelines.TextPipeline': 1, 'text.pipelines.MySQLPipeline': 300,}到这里,我们的项目就结束了。简单说一下它的功能。第一是将封面下载到本地。第二是将其他字段保存在本地的数据库中,封面图片在数据库中的保持方式为图片的地址,而不是图片的数据流。
4、让我们测试一下!
4.1 项目的启动。我们可以在pycharm中的terminal窗口键入scrapy crawl example
也可以在cmd窗口中使用相同的方法启动。
4.2 你可以在你的保存目录中找到这些图片。并且,你也可以在数据库中找到这些数据。
如果有什么地方不懂,欢迎留言或私信!