最近一直在做網絡爬蟲的練習,現在對整個爬取過程做個總結。
配置:
電腦: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)
其中…表示省略大量重複無用信息
可以看出已經爬取成功,下一章講一下如何爬取多頁