你好呀~

想学爬虫,看这一篇就够啦!

  如何使用scrapy框架实现简单的爬虫?个人整理出以下最简单的教学,让我们一起来看看吧!

Scrapy安装

# 安装
pip install scrapy
# 验证 scrapy

新建爬虫

# 新建爬虫项目,demo为项目名
scrapy startproject demo

确定目标

编写items.py,如添加要爬取的字段,如:

name = scrapy.Field()
age = scrapy.Field()
hobby = scrapy.Field()

制作爬虫

cd demo

# 生成爬虫demo.py
scrapy genspider demo "baidu.com"

我们需要修改demo.py里的start_urls的地址为自己想爬取的地址,如:https://www.cnblogs.com/teark/,还需要修改parse()方法,可暂时改为保存所爬取的页面,如:

def parse(self, response):
    with open("goal.html", "w", encoding='utf-8') as f:
      f.write(response.text)

一般保存html信息后,该段代码便没有意义了,注释掉即可。

爬取

# 运行爬虫
scrapy crawl demo

运行完会生成goal.html文件,接下来打开文件,进行调试数据。

页面调试

观察网页结构,明确要提取的信息在那个层级下,以确定xpath表达式的值,使用scrapy shell(最好先安装ipython,有语法提示),调试好了再放到代码里,如:

scrapy shell "https://www.cnblogs.com/teark/"
response.xpath('//*[@class="even"]') print site[0].xpath('./td[2]/text()').extract()[0]

提取

提取过程就是实现parse方法,根据保存的网页提取目标数据,一般用xpath表达式,如:

def parse(self, response):
    for each in response.xpath("//div[@class='teark_article']"):
        item = ItcastItem()
        title = each.xpath("h3/text()").extract()
        content = each.xpath("p/text()").extract()
        item['title'] = title[0]
        item['content'] = content[0]
        yield item

至此,html文件和保存文件的代码已经完成了它的作用,可以删掉,我们可以根据定义的字段直接抓取目标值。

# 保存数据,下格式都行:jsonl,jsonl,csv,xml
scrapy crawl demo -o demo.json

会生成demo.json文件,里面就是我们所需要的数据。

处理内容-pipeline

每次爬取时输出这么长的指令,能不能简单一点呢?可以的,pipline就是用来保存文件的:

from itemadapter import ItemAdapter


class TeacherPipeline:
    def __init__(self):
        self.file = open('teacher.json', 'wb')

    def process_item(self, item, spider):
        content = json.dumps(dict(item), ensure_ascii=False) + "\n"
        # 注意写入的是encode之后的字节,不然会乱码
        self.file.write(content.encode())
        return item

    def close_spider(self, spider):
        self.file.close()

还需要在settings.py中添加ITEM_PIPELINES配置,注意路径,如:

ITEM_PIPELINES = {
  "teacher.pipelines.TeacherPipeline": 300
 }

这时启动爬虫只需要scrapy crawl demo,看看当前目录是否生成demo.json,这样我们输入的指令就简单一点了。

posted @ 2021-01-17 21:41  测神  阅读(320)  评论(0编辑  收藏  举报