ITFunSpider/items.py

定义要爬取的属性

import scrapy


class ItfunspiderItem(scrapy.Item):
    # 标题
    title = scrapy.Field()

    # 详情连接
    url = scrapy.Field()

    # 图片
    image = scrapy.Field()

    # 日期
    date = scrapy.Field()

    # 点赞数
    likes = scrapy.Field()

    # 标签
    tags = scrapy.Field()

生成蜘蛛

scrapy genspider course "itfun.tv"

打开 ITFunSpider/spiders/cousrs.py,这里就是蜘蛛文件了

import scrapy
from ITFunSpider.items import ItfunspiderItem

class CourseSpider(scrapy.Spider):
    name = 'course'
    allowed_domains = ['itfun.tv']
    start_urls = ['https://itfun.tv/course_categories/front_end']

    def parse(self, response):
        for course in response.xpath('//div[@id="courseList"]/div/a'):
            item = ItfunspiderItem()

            # 课程信息节点
            info = course.xpath('./div[@class="info"]')

            # 注意:如果使用 extract,会变成列表[],而不是字符串
            item['title'] = info.xpath('./h3/text()').extract_first()

            print(item['title'])

运行蜘蛛

$ scrapy crawl course

user agent 伪装浏览器

若果发现出现 403 错误,配置 ITFunSpider/settings.py 中的 User-Agent,伪装成浏览器

DEFAULT_REQUEST_HEADERS = {
    "User-Agent" : "Chrome/75.0.3770.142",
}

或者

USER_AGENT = 'Chrome/75.0.3770.142'

Pipelines 管道文件

可以看到所有的标题都被爬取出来了,这时候还要将爬到的数据,交给 pipelines。因为所有接收到的数据,最终的处理都是在 pipelines 中,而不是直接在蜘蛛中。

ITFunSpider/spiders/cousrs.py 中,将 print(item['title']) 改为

yield item

ITFunSpider/pipelines.py

class ItfunspiderPipeline(object):
    def process_item(self, item, spider):
        print("标题:", item['title'])

ITFunSpider/settings.py 中,配置使用 Pipelines

ITEM_PIPELINES = {
   'ITFunSpider.pipelines.ItfunspiderPipeline': 300,
}

再次运行

$ scrapy crawl course

依然可以显示出来课程名称,并加上了标题:。这就说明现在抓取的数据,就传递到了 pipelines 中。