爬虫之Scrapy框架爬取彼岸壁纸案例分享
前段时间在网上看到有人爬取了彼岸壁纸的案例,由于爬取的图片较多,爬取速度感觉不快,所以就自己写了个Scrapy框架,个人觉得爬取速度快多了。
代码如下。
文章目录
- 爬虫之Scrapy框架爬取彼岸壁纸案例分享
- 一、建立Scrapy项目
- 二、建立启动文件start
- 三、 设置settings
- 四、在spiders中建立爬取逻辑
- 五、 在管道pipelines中保存图片
- 结果展示
- 总结
一、建立Scrapy项目
在终端输入以下代码建立scrapy框架
scrapy startproject bianwallpaper
cd wallpaper
scrapy genspider bian netbian.com
二、建立启动文件start
建立启动文件的目的是为了避免繁琐的终端输入命令,提高效率
from scrapy import cmdlinecmdline.execute(['scrapy', 'crawl', 'bian'])
三、 设置settings
在settings文件中进行相关设置,以便顺利的爬取网站和使用管道
1.设置LOG_LEVELl等级并关闭ROBOTSTEXT协议,注意:必须全部为大写
2. 设置headers
3. 打开管道pipelines
四、在spiders中建立爬取逻辑
import scrapy
import osclass BianSpider(scrapy.Spider):name = 'bian'allowed_domains = ['netbian.com']url = 'http://www.netbian.com/{}/index{}.htm'category = ['rili', 'dongman', 'fengjing', 'meinv', 'youxi', 'yingshi', 'dongtai', 'weimei', 'sheji', 'keai', 'qiche', 'huahui', 'dongwu', 'jieri', 'renwu', 'meishi', 'shuiguo', 'jianzhu', 'tiyu', 'junshi', 'feizhuliu', 'qita', 'wangzherongyao', 'huyan', 'lol']page_num = int(input('请输入要爬取的页码数(输入0表示爬取总页数):'))page_index0 = ''i = 0j = 1start_urls = [url.format(category[i], page_index0)]def parse(self, response):# 建立目标文件夹,用来保存图片dir_path = f'D:\\python-course\\practice2\\彼岸壁纸\\{self.category[self.i]}'if not os.path.exists(dir_path):os.mkdir(dir_path)# 获取每个分类的总页数if self.page_num == 0:total_pages = int(response.xpath('//div[@class="page"]/a/text()').extract()[-2])self.page_num = total_pagesli_lst = response.xpath('//div[@class="list"]/ul/li')for li in li_lst:item = {}title = li.xpath('a/b/text()').extract_first()href = li.xpath('a/@href').get()if title:item['title'] = title # 获取图片对应的标题item['href_url'] = response.urljoin(href) # 获取下一级的url,以便爬取分辨率更高的壁纸item['save_dir'] = dir_pathyield scrapy.Request(url=item['href_url'],callback=self.parse_href_url,meta={'item': item})# 过滤掉没用的图片网址else:continue# 判断是否爬取完某一分类所需的所有壁纸,爬取完后开始爬取下一分类的壁纸if self.j < self.page_num:self.j += 1self.page_index = self.page_index0self.page_index += '_' + str(self.j)next_url = f'http://www.netbian.com/{self.category[self.i]}/index{self.page_index}.htm'yield scrapy.Request(url=next_url)print('开始爬取下一页内容。。。')else:self.i += 1if self.i < len(self.category):self.j = 1new_url = self.url.format(self.category[self.i], self.page_index0)yield scrapy.Request(url=new_url)print(f'开始爬取{self.category[self.i]}的内容。。。')def parse_href_url(self, response):item = response.meta['item']item['img_src'] = response.xpath('//div[@class="pic"]/p/a/img/@src').get() # 获取到所需的图片urlyield item
五、 在管道pipelines中保存图片
import urllib.requestclass BianwallpaperPipeline:count = 0def process_item(self, item, spider):print(item['img_src'])self.count += 1print(self.count)urllib.request.urlretrieve(item['img_src'], item['save_dir']+f'\\{item["title"]}{self.count}.png') # 保存文件return item
结果展示
总结
scrapy爬取数据确实要比一般的方法快很多,尤其在爬取的内容非常多时。但是,个人觉得scrapy使用起来也是挺繁琐的,需要不停的切换文件来进行调试。总之,如果不是爬取的内容太多,我还是会选择用普通方法来爬取。