六、Scrapy(一)| 入门案例、本地测试、迁木网爬虫

一、入门案例

1、编写爬虫

创建 test.py 文件

# encoding: utf-8

"""
@author: sunxianpeng
@file: test.py
@time: 2019/10/26 18:37
"""
import scrapy

class Main(scrapy.Spider):
    def __init__(self):
        pass
    # 爬虫的名字
    name ="quote"
    # 起始的url列表
    start_urls = ['http://quotes.toscrape.com/']

    # 固定函数,固定写法
    def parse(self, response):
        # css和 xpath 都可以实现
        # quotes = response.css("div.quote")
        quotes = response.xpath('//div[@class="quote"]')#和上述作用一样
        for quote in quotes:
            yield {
                # extrack_first提取第一个选择器的内容
                "text": quote.css('span.text::text').extract_first(),
                "author": quote.xpath('./span/small/text').extract_first()
            }
        next_page = response.xpath('//li[@class="next"]/a/@href').extract_first()

        if next_page:
            # page下载完后,交给谁处理(再交给parse函数处理)
            yield response.follow(next_page,self.parse)



if __name__ == '__main__':
    m = Main()

2、本地运行测试

(1)Pycharm下,点击下方按钮

(2)切换到 .py文件所在的路径

cd spider/scrapy/

(3)运行命令

运行例子,并将结果保存在 csv 文件中

scrapy runspider test.py -o quotes.csv -t csv

二、迁木网爬虫

(1)Pycharm下,点击下方按钮

(2)切换到想要创建scrapy项目的路径,执行命令

scrapy startproject qianmu

显示

(3)执行命令

cd qianmu
tree

显示

(4)执行命令

指定爬虫的名字(qianmu_collage_rank)和爬取的域名(www.qianmu.org)

注意:爬虫名字不能和项目名字重复

 scrapy genspider qianmu_collage_rank www.qianmu.org

(5)最终项目结构为

(6)编写爬虫程序

在 qianmu_collage_rank.py 文件中编写以下内容

# -*- coding: utf-8 -*-
import scrapy


class QianmuCollageRankSpider(scrapy.Spider):
    name = 'qianmu_collage_rank'
    # 允许爬的域名内的url,即爬取的网页必须以改域名开头
    allowed_domains = ['www.qianmu.org']
    # 爬虫的入口地址,可以写多个,
    start_urls = ["http://www.qianmu.org/ranking/1528.htm"]

    def parse(self, response):
        """ start_urls请求成功后,自动调用该方法"""
        # 解析start_urls, extract()提取所有符合条件的文本,extract()返回的永远是列表
        # extract_first()在当解析出来的数据只有一个时可以使用
        links = response.xpath('//tbody//tr[@height=19][position()>1]/td/a/@href')\
            .extract()
        for i in range(len(links)):
            link = str(links[i])
            if not link.startswith("http://www.qianmu.org"):
                link = "http://www.qianmu.org/%s" % link
            try:
                # 让框架即系跟随这个链接,也就是说会再次发起请求
                # 请求成功以后,会调用指定的call_back函数parse_collage
                # 中间过程均是异步调用
                yield response.follow(link,self.parse_collage)
            except Exception as e:
                continue

    def parse_collage(self,response):

        data = {}
        keys = []
        values = []
        data["collage_name"] = response.xpath('//div[@id="wikiContent"]/h1/text()')[0]
        # 处理单元格内有换行
        table = response.xpath('//div[@id="wikiContent"]/div[@class="infobox"]//table')
        if table :
            table = table[0]
            cols_k = table.xpath('.//td[1]')
            cols_v = table.xpath('.//td[2]')
            for j in range(len(cols_k)):
                col_k = cols_k[j]
                col_v = cols_v[j]
                keys.append(''.join(col_k.xpath('./p//text()').extract()))
                values.append(''.join(col_v.xpath('./p//text()').extract()))
            # 合并两个列表组成字典,将zip后得到的字典 添加到data字典中
            data.update(zip(keys, values))
        # yield出去的数据,会被框架接收,进行下一步的处理,
        # 如果没有任何处理,则会打印到控制台
        yield data

(7)运行,并查看控制台输出结果

两种方式

a、运行scrapy爬虫

scrapy crawl qianmu_collage_rank
# 将爬取的数据导出到json文件或者csv文件
scrapy crawl qianmu_collage_rank -o qianmu_collage_rank.json
scrapy crawl qianmu_collage_rank -o qianmu_collage_rank.csv -t csv

b、单独运行爬虫文件

scrapy runspider qianmu_collage_rank.py

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值