Python scrapy 使用记录

栏目: 编程工具 · 发布时间: 7年前

内容简介:Python scrapy 使用记录

相关文档: https://doc.scrapy.org/en/latest/

安装配置好pip,安装scrapy

pip install scrapy

win7环境

IDE PyCharm

遇到错误: No module named 'win32api'

pip install pypiwin32

PyCharm自带命令行中使用scrapy shell,适合于调试

scrapy shell http://quotes.toscrape.com/tag/humor/

# 使用本地网页
scrapy shell ./web_source/a118335.html

scrapy新建项目 例如新建一个 tutorial项目

scrapy startproject tutorial

分析本地网页

使用 shell 分析本地某个网页

# 使用本地网页
scrapy shell ./web_source/a118335.html
res = response 

# 获取h1作为title
title = res.css('h1.nameSingle')

title.css('a::text').extract_first()
# '進撃の巨人 Season 2'

title.css('a::attr(href)').extract_first()

title.css('a::attr(title)').extract_first()
# '进击的巨人 第二季'

title.css('small::text').extract_first()
# 'TV'

# 获取信息表
info = res.css('div.infobox')

# 获取封面图片地址
info.css('a::attr(href)').extract_first()

info.css('li')[0].css('span::text').extract_first()
# '中文名: '

info.css('li')[0].css('li::text').extract_first()
# '进击的巨人 第二季'

在scrapy中使用

import scrapy


class AnimeSpider(scrapy.Spider):
    name = "bang"

    start_urls = [
        'file://H/fisher_p/crawl-anime/web_source/a118335.html',
    ]

    def parse(self, response):
        res = response

        # 获取h1作为title 抓取基本信息
        title = res.css('h1.nameSingle')
        name_jp = title.css('a::text').extract_first()
        a_link = title.css('a::attr(href)').extract_first()
        bang_id = str(a_link).split('/')[-1]
        name_zh = title.css('a::attr(title)').extract_first()
        sub_title = title.css('small::text').extract_first()
        print(name_jp + " , " + name_zh + " , " + bang_id + " , " + sub_title)

        # 获取信息表
        info = res.css('div.infobox')

        pic_link = info.css('a::attr(href)').extract_first()  # 获取封面图片地址
        print("pic link: " + pic_link)
        for li in info.css('li'):
            info_title = li.css('span.tip::text').extract_first()
            info_content_href = li.css('a').extract_first()
            if info_content_href is None:
                info_contents = li.css('li::text').extract_first()
            else:
                # 若是链接 将其中的信息提取拼接成一个字符串
                people_bang_id = str(li.css('a::attr(href)').extract_first()).split("/")[-1]
                info_contents = li.css('a::text').extract_first() + "|" + people_bang_id
            print(info_title + " " + str(info_contents))

执行爬虫

scrapy crawl bang--nolog

scrapy 下载图片并重命名

让scrapy下载图片,并重命名目标图片

以某个图片爬虫为例。在scrapy工程中需要的文件有

├── proj_name  # 工程
│   ├── __init__.py  # 初始化
│   ├── items.py  # 定义图片类的地方
│   ├── middlewares.py
│   ├── pipelines.py  # 执行保存文件的地方
│   ├── settings.py  # 配置文件 比如图片下载目录
│   └── spiders
│       ├── _pic_spider.py  # 图片爬虫

图片下载爬虫。这里我事先已将所有的图片链接存了起来,爬虫自己读取预先存好的链接

# _pic_spider.py # 图片爬虫
class CoverPicSpider(scrapy.Spider):
    name = "bpic"
    start_urls = []  # 这里装的是图片的链接

    def parse(self, res):
        bang_id = res.url.split("/")[-1].split("_")[0]
        item = AnimeBangCoverPicItem()  # 自定义的一个类 表示图片
        item['file_name'] = "p_" + bang_id + ".jpg"
        item['image_urls'] = [res.url]  # Must be a list
        yield item

配置一个文件名

# items.py
# 定义一个图片类
class AnimeBangCoverPicItem(scrapy.Item):
    image_urls = scrapy.Field()
    images = scrapy.Field()
    file_name = scrapy.Field()

Pipeline 中重命名图片。重写方法 file_path ,返回我们自定义的文件名

# pipelines.py # 执行保存文件的地方
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline

class AnimeBangCoverPicPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            # 传入目标文件名
            yield scrapy.Request(image_url, meta={'item': item, 'file_name': item['file_name']})

    # 重写这个方法来自定义文件名
    def file_path(self, request, response=None, info=None):
        return request.meta['file_name']

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        return item

设置图片存储目录,设置DOWNLOAD_DELAY

# settings.py
ITEM_PIPELINES = {
    'bang.pipelines.AnimeBangCoverPicPipeline': 1,

}
IMAGES_STORE = '../res_data/anime_pic/'
DOWNLOAD_DELAY = 0.25

启动爬虫即可开始下载图片


以上所述就是小编给大家介绍的《Python scrapy 使用记录》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高效程序员的45个习惯

高效程序员的45个习惯

Venkat Subramaniam、Andy Hunt / 钱安川、郑柯 / 人民邮电出版社 / 2010-01 / 35.00元

“书中‘切身感受’的内容非常有价值——通过它我们可以做到学有所思,思有所悟,悟有所行。” ——Nathaniel T. Schutta,《Ajax基础教程》作者 “此书通过常理和经验,阐述了为什么你应该在项目中使用敏捷方法。最难得的是,这些行之有效的实战经验,竟然从一本书中得到了。” ——Matthew Johnson,软件工程师 十年来,软件行业发生了翻天覆地的变化。敏捷......一起来看看 《高效程序员的45个习惯》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码