Python的爬虫非常简单,现在又有成熟的爬虫框架scrapy。现在,我们来用scrapy爬取自己虾米歌单上的歌曲。
通过这篇博客,你将学到:
- 基本的爬虫设计
- 模拟登陆
- 维持登陆状态
- Xpath
(中的一点皮毛233)。本文默认读者已经通过scrapy官方文档或中文版安装好了,并试过了测试用例。
然后第一步创建项目:scrapy startproject xiami
命令会在当前路径下创建名为xiami
的scrapy项目。
基本的爬虫设计
从需求的角度出发,先想好我们要爬取的内容,简单一点的话就爬取网页的标题、用户的名字、歌单的歌名。行文顺序参照scrapy官方文档的习惯。
items
先来修改items.py文件。items是保存数据的容器,它是scrapy框架自己的数据结构,与字典类似,都是键-值对的形式保存数据。定义了items,我们就可以用scrapy的方式保存数据到各种数据库或者本地文件。将来我们要把爬取到的歌单保存到本地的json文件中。
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
# ...
import scrapy
class XiamiItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
class XiamiItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field() # 网页的标题
name = scrapy.Field() # 用户的名字
song = scrapy.Field() # 歌单的歌名
pass
这里我们相当于只是创建了一个空的字典,然后定义了里面的键值。下面我们需要定义爬虫爬取数据,并把数据交付给items。
spider
当前项目下的spider文件夹下只有一个空的__init__.py
文件。该文件夹负责容纳自定义的爬虫模块。在spider文件夹下创建一个py文件,就是一个爬虫模块,当然它现在还没有任何的功能。创建python file——xiami_spider.py
,这就是我们用来爬取虾米歌单的爬虫了。然后定义它的基本元素
from scrapy.spiders import CrawlSpider, Rule
class XiamiSpider(CrawlSpider):
name = "xiaoxia" # 爬虫名:小虾
allowed_domains = ["xiami.com"]
start_urls = [
"http://www.xiami.com"
]
account_number = '9839****8@qq.com' # 换上你的账号
password = '123456' # 换上你的密码
# 重写了start_request方法,Spider类不会再自动调用该方法来为start_url中的url创建Request
def start_requests(self):
return [Request("https://login.xiami.com/member/login",
meta={
'cookiejar': 1},
callback=self.post_login)]
- 在这个新建的类中,我们继承的是CrawlSpider而不是普通的Spider,CrawlSpider是Spider的子类,所以它会有更多的功能,这样可以少些很多代码。
- 定义了爬虫的名字,最后在运行程序的时候,需要用到这个名字。
- 定义了爬取区域的大小。如果不讲范围限制在虾米网站的网页中,爬虫如果不停地最终网页中的新链接的话,可能会爬取到很多无关网站的无关内容
- 定义了初始的URL,对spider来说,爬取的循环类似下文:
- 调用默认
start_requensts()
函数,以初始的URL初始化Request,并设置回调函数。 当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。spider中初始的request是通过调用 start_requests() 来获取的。 start_requests() 读取 start_urls 中的URL, 并以 parse 为回调函数生成 Request 。 - 在回调函数内分析返回的(网页)内容,返回 Item 对象或者 Request 或者一个包括二者
- 调用默认