Python实战演练之scrapy初体验

最近一直在做网络爬虫的练习,现在对整个爬取过程做个总结。
配置:
电脑:MacBook Pro
系统:macOS Catalina 10.15.3
Python版本:3.8
Python IDE:PyCharm
数据库:Mysql
数据库管理工具:Navicat Premium

正式进入正题

scrapy初体验

scrapy安装我前面有在macOS成功在python3环境下安装Scrapy中提到,这里就不细讲。

Scrapy框架的使用
1、使用scrapy staryproject命令来创建一个项目
2、进入项目目录,创建爬虫spider类文件
3、进入items.py创建自己的Item内容类
4、进入自定义的spider类,解析Response信息,并封装到Item中
5、使用Item Pipelines项目管道对解析出来的Item数据进行清理、验证、去重、存储。
6、执行爬取命令来进行爬取信息

今天的实战演练的目标:爬取csdn学院中的课程信息
网址:

  • https://edu.csdn.net/courses/o280/p1

1、创建scrapy项目

$ scrapy startproject csdnedu

2、创建爬虫

# 进入csdnedu
$ cd csdnedu
# 创建爬虫 
csdnedu$ scrapy genspider courses edu.csdn.net

这时候csdnedu项目中spiders文件夹里面会添加一个courses.py的文件,用来解析数据。

3、数据分析

通过对csdn学院中的课程信息进行分析,发现我们需要的数据为:课程标题、url地址、图片、讲师、总课时、价格
在items.py中,给item类定义

items.py:

import scrapy

class CoursesItem(scrapy.Item):
    '''课程信息item类:课程标题、url地址、图片、讲师、总课时、价格'''
    # define the fields for your item here like:
    title = scrapy.Field()
    url = scrapy.Field()
    pic = scrapy.Field()
    teacher = scrapy.Field()
    time = scrapy.Field()
    price = scrapy.Field()

4、数据解析

在courses.py中解析从网页爬取的课程信息,并打印item数据
注意将start_urls改为真正网址

import scrapy
from educsdn.items import CoursesItem

class CoursesSpider(scrapy.Spider):
    name = 'courses'
    allowed_domains = ['edu.csdn.net']
    start_urls = ['https://edu.csdn.net/courses/o280/p1']

    def parse(self, response):
        # 解析课程信息
        # 获取当前请求页面下的所有课程信息
        print(dd.xpath("./div[@class='titleInfor'/text()]").extract())
        dl = response.selector.css("div.course_item")
        # 遍历课程信息并封装到item
        for dd in dl:
            item = CoursesItem()
            item['title'] = dd.css("span.title::text").extract_first()
            item['url'] = dd.css("a::attr(href)").extract_first()
            item['pic'] = dd.css("img::attr(src)").extract_first()
            item['teacher'] = dd.css("span.lecname::text").extract_first()
            item['time'] = dd.css("span.course_lessons::text").extract_first()
            item['price'] = dd.css("p.priceinfo i::text").extract_first()
            print(item)

css选择器的定位,可根据网页源码进行更改

5、开始爬取

csdnedu$ scrapy crawl courses
$ scrapy crawl courses
[scrapy.utils.log] INFO: Scrapy 1.8.0 started (bot: educsdn)
[scrapy.utils.log] INFO: Versions: lxml 4.5.0.0, libxml2 2.9.10, cssselect 1.1.0, parsel 1.5.2, w3lib 1.21.0, Twisted 19.10.0, Python 3.8.0 (v3.8.0:fa919fdf25, Oct 14 2019, 10:23:27) - [Clang 6.0 (clang-600.0.57)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1d  10 Sep 2019), cryptography 2.8, Platform macOS-10.15.3-x86_64-i386-64bit
......
[scrapy.core.engine] INFO: Spider opened
[scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
[scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
[scrapy.core.engine] DEBUG: Crawled (200) <GET https://edu.csdn.net/robots.txt> (referer: None)
[scrapy.core.engine] DEBUG: Crawled (200) <GET https://edu.csdn.net/courses/o280/p1> (referer: None)
{'pic': 'https://img-bss.csdn.net/20191228170738253.jpg',
 'price': '\n                            ¥69.00                        ',
 'teacher': '郭宏志',
 'time': '24课时',
 'title': '\n'
          '                                                '
          'Java小白修炼手册                        ',
 'url': 'https://edu.csdn.net/course/detail/27274'}
......
{'pic': 'https://img-bss.csdn.net/20191212221506454.jpg',
 'price': '\n                            ¥199.00                        ',
 'teacher': '李宁',
 'time': '23课时',
 'title': '\n'
          '                                                跟宁哥学python '
          'scrapy爬虫开发                        ',
 'url': 'https://edu.csdn.net/course/detail/27058'}
[scrapy.core.engine] INFO: Closing spider (finished)
......
[scrapy.core.engine] INFO: Spider closed (finished)

其中…表示省略大量重复无用信息
可以看出已经爬取成功,下一章讲一下如何爬取多页

原创文章 214 获赞 359 访问量 89万+

猜你喜欢

转载自blog.csdn.net/yxys01/article/details/104634279