百度图片抓取

使用scrapy对百度图片抓取

   这篇水文是为那些刚刚开始写爬虫的朋友们准备的,已经在爬虫坑里呆了很久的老鸟请绕过(自己分析去!你个伸手党)。
   废话不多说(这就说的不少了),打开百度图片就长这个吊样子
在哪个框框里面输入你想要下载的图片名称例如白云,苍(老师),狗 。然后,我就输入了”狗”。就是这个吊样子狗
然后,打开检查(F12)勾选日志,选择XHR筛图
然后就开始撸代码了,创建一个scrapy项目,不会的同学自行百度。然后,爬虫这样写的:`# -- coding: utf-8 --
import re
import scrapy
import json
from spiderframe.items import ImgsItem
from urllib.parse import quote

class ImageBaiduSpider(scrapy.Spider):
name = ‘image_baidu’

def __init__(self, category=None, *args, **kwargs):
    super(ImageBaiduSpider, self).__init__(*args, **kwargs)
    self.category = category

def start_requests(self):
    url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={category}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word={category}&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1560505489300=".format(category=quote(self.category))
    yield scrapy.Request(url=url,  callback=self.parse, dont_filter=True)

def parse(self, response):
    resp = json.loads(response.text)
    data = resp.get("data", [])

    img_urls = []
    for img in data:
        hover_url = img.get("middleURL")
        if hover_url:
            img_urls.append(hover_url)
            print(hover_url)

    item = ImgsItem()
    item["category"] = self.category
    item["image_urls"] = img_urls
    yield item

    total_num = resp.get("displayNum")
    current_num = re.findall('&pn=(.*?)&rn=30', response.url)[0]
    if int(current_num) < int(total_num):
        url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={category}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word={category}&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn={page}&rn=30&gsm=1e&1560505489300=".format(
            category=quote(self.category), page=int(current_num)+30)
        yield scrapy.Request(url=url, callback=self.parse, dont_filter=True)

`
items 是这样定义的:

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

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class SpiderframeItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
	# 这个跟爬图片无关
    url = scrapy.Field()
    content = scrapy.Field()


class ImgsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
	# 这个是爬图片的
    category = scrapy.Field()
    image_urls = scrapy.Field()     # 这个图片的URL 类型:list
    images = scrapy.Field()         # 这个看源码,源码说默认结果字段,也不知道要它干啥, 有个屌用!

pipelines是这样写的


class ImagePipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        # 这个方法是在发送下载请求之前调用的,其实这个方法本身就是去发送下载请求的
        request_objs = super(ImagePipeline, self).get_media_requests(item, info)
        for request_obj in request_objs:
            request_obj.item = item
        return request_objs

    def file_path(self, request, response=None, info=None):
        # 这个方法是在图片将要被存储的时候调用,来获取这个图片存储的路径
        path = super(ImagePipeline, self).file_path(request, response, info)
        category = request.item.get('category')
        image_store = settings.IMAGES_STORE
        category_path = os.path.join(image_store, category)
        if not os.path.exists(category_path):
            os.makedirs(category_path)
        image_name = path.replace("full/", "")
        image_path = os.path.join(category_path, image_name)
        return image_path

setting设置是这样的:

# image info
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'spiderframe/files/image')
ITEM_PIPELINES = {
    'spiderframe.pipelines.SpiderframePipeline': 300,
    'spiderframe.pipelines.RedisPipeline': 350,
    'spiderframe.pipelines.MySQLPipeline': 400,
    'spiderframe.pipelines.ImagePipeline': 450,	# 就这个是图片,其他不用看
}

让爬虫跑起来就完事了,不会让爬虫跑起来的自行百度。
两个小坑,一个是爬虫传进去那个参数关键词:“狗” 要编码一下。链接要用https不能用http
两个小坑注意,不然返回的图片URL无法下载。

如果您下载了本程序,但是该程序无法运行,或者您不会部署,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的) 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值