这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
Scrapy描述🎨
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。
Scrapy框架主要由五大组件组成,分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。 Scheduler接收url并发起请求,Downloader将内容下载下来,通过引擎和中间件处理掉无用的数据再发送到Spider, 我们根据自己的需要提取数据,请求成功就将数据保存到items里面存入Pipeline, 如果失败就会重新发送url到Scheduler
创建Scrapy项目💤
首先下载安装scrapy:pip install Scrapy
创建scrapy项目: scrapy startproject movieScrapy, 我的项目名是movieScrapy; 在spiders下创建爬虫文件: scrapy genspider spiderData 你要访问的网页域名
这是创建好的目录结构的样子
items.py 相当于一个封装类,用来封装要传到管道的数据;middlewares.py是中间件,一般不需要进行编写;pipelines.py用来处理数据, settings.py是配置文件
首先我们改一下settings配置文件
ROBOTSTXT_OBEY = False 默认是True,我们改成False,因为如果遵守robots协议,我们会很多东西都拿不到; CONCURRENT_REQUESTS = 32 最大并发请求,默认16,并不是越大越好;
DOWNLOAD_DELAY = 2 下载延迟,可以避免访问次数过快ip被封;
COOKIES_ENABLED = True 默认携带上一次访问的cookie;
DEFAULT_REQUEST_HEADERS = {} 请求头,里面可以写User-Agent、Cookie、Referer; ITEM_PIPELINES 项目管道,300为优先级,越低越爬取的优先度越高
爬取图片❤
今天的任务是爬取图片,冲冲冲!!!
items.py
在items.py里面定义我们需要的字段,方便管道传输
import scrapy
class MoviescrapyItem(scrapy.Item):
# 图片名称
name = scrapy.Field()
# 图片地址
url = scrapy.Field()
爬虫文件.py
爬虫文件目录下的完整代码, 详细url地址我就用xxx代替了
class SpiderdataSpider(scrapy.Spider):
name = 'spiderData'
allowed_domains = ['x.com']
start_urls = ['https://x.com/x/x/']
def parse(self, response):
articles = response.xpath("//div[@class='galleryWrapper']/section/section/section/section/article")
for article in articles:
url = article.xpath("./section/section/a/@href").extract()[0]
yield scrapy.Request(url, callback=self.MainUrl)
def MainUrl(self, response):
data = response.text
name = response.xpath("//div[@class='image_name']/text()").extract()[0]
url = response.xpath("//section[@class='image-card']/section/figure/div[@class='unzoomed']/img/@src").extract()[0]
url = "https:" + url
item = MoviescrapyItem()
item['name'] = name
item['url'] = url
yield item
name = 'spiderData' 启动文件,就是通过这个name scrapy crawl spiderData ;allowed_domains = ['x.com'] 不是这个域名下的链接会自动过滤,name和allowed_domains都是创建文件时自动生成的;
parse函数里面的response已经自动下载好了数据资源,可以通过response.text进行查看,通过xpath可以去获取目录下所需要的数据,其中extract()[0]可以提取文字
yield scrapy.Request(url, callback=self.MainUrl) 我们在循环里不断提取图片详细页的链接,并通过 yield 来发起请求,并且还将函数 MainUrl 作为回调函数来从响应中提取所需的数据。
yield在每次循环中都会返回数据
item = MoviescrapyItem()将获取到的数据实例化通过yield传到管道
pipelines.py
import urllib.request
class MoviescrapyPipeline:
def __init__(self):
pass
def process_item(self, item, spider):
name = item['name']
urllib.request.urlretrieve(item['url'], "./Loadimg/" + name + '.jpg')
return item
def close_spider(self, spider):
pass
__init__ 函数是最开始执行的,我们可以用来准备存储文件的打开及一些设置,像csv
process_item 就是处理数据的,我们保存图片就是在这里,item也就是我们之前通过yield传递过来的值
close_spider 我们可以用来关闭csv文件这样
这样图片就获得了🎈🎈🎈