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)

其中…表示省略大量重複無用信息
可以看出已經爬取成功,下一章講一下如何爬取多頁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章