scrapy初学:爬百度图片

爬虫初学:基于Pycharm用scrapy爬取百度图片

初学爬虫

本人最近初学爬虫的相关知识和实现,这里简单介绍一下对如何用scrapy进行百度图片的抓取,记录一下自己踩过的坑。

选择工具

  1. Pycharm 2020.1
  2. Scrapy
  3. python 3.8

功能说明

制作百度图片的scrapy爬虫,能够根据关键字下载百度图片并标明序号和进行存储。

具体内容和代码

由于scrapy工具有出色的表现和良好的口碑,因此一直想学习用scrapy来爬取数据。

  1. 在Pycharm中安装scrapy,运用Pycharm安装库方法即可,打开Pycharm后,点击File->Setting->Project
    Interpreter后,选择弹出对话框的+,从选择包中选择scrapy安装即可。!

在这里插入图片描述
其中踩过的坑在后续章节中会写明。

安装完scrapy, 即可在Pycharm终端处通过命令

scrapy startproject projectname

建立爬虫项目,生成pipeline, setting等相关文件。这里我写的项目名称是BaiduScrapy。在./BaiduScrapy/Spiders文件夹下的新建爬虫的python文件:BaiduPicSpider.py,作为爬虫的类。
生成的项目目录如下图:
在这里插入图片描述
3.
后续修改以下程序实现目标工程:
Settings.py处增加:

ROBOTSTXT_OBEY = False

MAX_PAGE = 30

IMAGES_STORE = './images'

ITEM_PIPELINES = {
   'BaiduScrapy.pipelines.BaiduImagePipeline': 300,
}

BaiduPicScrapy.py的代码为:

# -*- coding: utf-8 -*-

# Define here the models for image scrape

from scrapy import Spider, Request
from urllib.parse import quote
from BaiduScrapy.items import BaiduImageItem
import json

class ImageSpider(Spider):
    name = 'image'
    allowed_domain = ['images.baidu.com']
    start_url = ['https://image.baidu.com/']
    url_info = {'url_seq': 1}

    def parse(self, response):
        images = json.loads(response.body)['data']
        for image in images:
            item = BaiduImageItem()
            try:
                item['url'] = image.get('thumbURL')
                item['url_seq'] = self.url_info['url_seq']
                item['url_name'] = self.url_info['url_name']
                self.url_info['url_seq']  = self.url_info['url_seq']  + 1
                print("%s:%s\n" % ("parse", item['url']))
                yield item
            except Exception as e:
                print(e)
        pass

    def start_requests(self):
        data = {'queryWord':'战斗机','word': '战斗机'}   ####此处可以根据要求修改关键词
        base_url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord='
        if data['queryWord'] == '战斗机':               ####此处可以根据要求修改关键词
            self.url_info['url_name']= 'Fighter'       ####此处可以根据要求修改关键词
        for page in range(1, self.settings.get('MAX_PAGE') + 1):
            data['pn'] = page * 30
            url = base_url + quote(data['queryWord']) + '&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word='+quote(data['word'])+'&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn='+quote(str(data['pn']))+'&rn=30&gsm=1e'
            yield Request(url, callback = self.parse)

items.py的代码修改为:

import scrapy


class BaiduImageItem(scrapy.Item):
    # define the fields for your item here like:MG_URL
    url = scrapy.Field()
    url_name = scrapy.Field()
    url_seq = scrapy.Field()
    pass

pipelines.py的代码修改为:

from scrapy import Request
from scrapy.pipelines.images import ImagesPipeline

class BaiduImagePipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        file_meta = {}
        file_meta['url_name'] = item['url_name']
        file_meta['url_seq'] = item['url_seq']
        yield Request(item['url'], meta=file_meta)


    def file_path(self, request, response=None, info=None):
        url = request.url
        format = url.split('.')[-1]
        file_meta = request.meta
        file_name = file_meta['url_name']+'_'+str(file_meta['url_seq'])+'.'+format
        return file_name

调试运行程序时,需要配置运行环境,将X:\Program Files\Python\Python38\Lib\site-packages\scrapy\cmdlines.py拷贝到建立项目文件夹中,与scrapy.cfg在相同目录,然后点击Pycharm界面中的Configurations,在弹出对话框中,按以下内容进行配置:

在这里插入图片描述然后点击Pycharm中Run->Run’BaiduPicSpider’即可运行爬虫。

踩过的坑

  1. 在Pycharm安装scrapy可能会出现需要安装VC14 ++的情况,下载Twisted.whl,然后安装即可解决此问题。
  2. 在项目解释器(Project Interpreter)时,可以选择为Python安装目录中的python.exe,因为Pycharm针对每个项目都会建立虚拟环境,如果是自己联系,选择Python安装目录中的python.exe,则安装完所需安装包后,后续项目可以继续用。如果是开发项目,可以针对每个项目用专用的python.exe,这样方便移植。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值