最近一直在做网络爬虫的练习,现在对整个爬取过程做个总结。
配置:
电脑: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)
其中…表示省略大量重复无用信息
可以看出已经爬取成功,下一章讲一下如何爬取多页