初学爬虫
本人最近初学爬虫的相关知识和实现,这里简单介绍一下对如何用scrapy进行百度图片的抓取,记录一下自己踩过的坑。
选择工具
- Pycharm 2020.1
- Scrapy
- python 3.8
功能说明
制作百度图片的scrapy爬虫,能够根据关键字下载百度图片并标明序号和进行存储。
具体内容和代码
由于scrapy工具有出色的表现和良好的口碑,因此一直想学习用scrapy来爬取数据。
- 在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=©right=&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’即可运行爬虫。
踩过的坑
- 在Pycharm安装scrapy可能会出现需要安装VC14 ++的情况,下载Twisted.whl,然后安装即可解决此问题。
- 在项目解释器(Project Interpreter)时,可以选择为Python安装目录中的python.exe,因为Pycharm针对每个项目都会建立虚拟环境,如果是自己联系,选择Python安装目录中的python.exe,则安装完所需安装包后,后续项目可以继续用。如果是开发项目,可以针对每个项目用专用的python.exe,这样方便移植。