一、Scrapy
什么是Scrapy
Scrapy框架是一套比较成熟的Python爬虫框架,是使用Python开发的快速、高层次的信息爬取框架,可以高效率地爬取Web页面并提取出我们关注的结构化数据。
为什么学习Scrapy呢?因为它能让我们更好地完成爬虫任务,自己写Python爬虫程序好比孤军奋战,而使用了Scrapy就好比手下有了千军万马,可以起到事半功倍的效果。所以,学习Scrapy也就显得很有必要了。
Scrapy的安装
我事先下载过Anaconda这样一个包括了Conda、Python以及一大堆安装好的工具包,是一个开源的Python发行版本,并设置好系统环境变量后,直接通过cmd命令行,输入:conda install scrapy,再输入y和回车,即可安装好Scrapy。在命令行中输入scrapy+回车,显示相关信息,则表示scrapy安装成功。
然后在PyCharm-->file-->settings-->搜索project interpreter(项目解释器)-->选择安装Anaconda3目录下的python.exe,点击OK即可完成所有安装和配置。
最后在PyCharm中创建一个Scrapy项目,先通过命令行将路径转到即将创建项目的目录下,输入如下命令并按回车:
scrapy startproject 项目名
scrapy startproject是固定的命令,后面的项目名根据需要自取。
该命令执行完后,就会产生包含下列内容的目录:
这些文件分别是:
- TestDemo/: 该项目的python模块,之后将在此加入Spider代码。
- TestDemo/spiders/: 放置spider代码的目录。
- TestDemo/items.py: 项目中的item文件。
- TestDemo/middlewares.py:项目中的中间件。
- TestDemo/pipelines.py: 项目中的pipelines文件。
- TestDemo/settings.py: 项目的设置文件。
- scrapy.cfg: 项目的配置文件。
二、元素选择器xpath的用法总结
xpath语法
在设计爬虫时,最重要的一步就是对网页元素进行分析。Scrapy的元素选择器Xpath(结合正则表达式)是众多网页元素获取工具中较为出色的一种(当然只能在Scrapy中使用),功能相对较全,使用较为方便,在此整理一些,以供日后回顾。
xpath是一种XML路径语言,通过该语言可以在XML文档中迅速地查找到相应的信息,xpath表达式通常叫作xpath selector。
在xpath表达式中,比如可以使用“/”可以选择某个标签,并且可以使用“/”进行多层标签的查找;使用“//”可以提取某个标签的所有信息;通过“//Z[@X="Y"]”的方式获取所有属性X的值为Y的<Z>标签的内容。
xpath的具体语法如下:
Shell命令
在正式编写程序之前,我们可以使用Scrapy内置的Scrapy shell,尝试分析相关网页,为后续编写梳理一下思路。
比如针对80s电影网进行shell操作:
在Scrapy shell中,我们可以通过如下指令打印网页的body信息:
response.body
输出了网页的全部源代码,比较杂,这里就不做展示了。
通过查看源代码,看出每一个影片超链接,都在一个div内,且a标签具有title属性,表示节目名。
于是通过以下命令行显示了所有电影名信息:
通过extract()显示更完整的信息:
也可以通过text()获取标签中的文本信息,如下所示:
电影网的首页简单分析到这里,下面看看某一种类型电影的子页面的分析,看是否能获取每一个电影的图片链接。
scrapy shell "https://www.80s.tw/movie/list/-----p/"
这里思考一个问题,从这个网页我们要获取哪些信息?第一个当然还是图片的链接,第二个呢?将每个页面的每个图片保存下来,我们如何命名图片?用默认名字下载下来的图片,顺序也就乱了。仔细一点的话,不难发现,第一页的链接为:https://www.80s.tw/movie/list/-----p/,第二页的链接为:https://www.80s.tw/movie/list/-----p/2,第三页的链接为:https://www.80s.tw/movie/list/-----p/3,依此类推,所以我们可以根据这个规律进行翻页。而为了翻页,首先需要获取的就是每个页面的图片数,随后,我们根据每页的地址就可以为每个图片命名,而且不会出现乱序,并且很工整,方便我们阅读。
每张图片的链接:
Scrapy程序测试
在TestDemo/spiders目录下的文件_init_.py中,编写内容如下:
import scrapy
class TestDemo(scrapy.Spider):
name = "TestDemo"
allowed_domains = "www.80s.tw"
start_urls = ["https://www.80s.tw/movie/list/-----p/"]
def parse(self, response):
link_url = response.xpath("//img/@src").extract()
for each_url in link_url:
print(each_url)
- name:自己定义的内容,在运行工程的时候需要用到的标识。
- allowed_domains:让爬虫只在指定域名下进行爬取,值得注意的是,这个域名需要放到列表里。
- start_urls:开始爬取的url,同样这个url链接也需要放在列表里。
- def parse(self, response) :请求分析的回调函数。
下面通过如下命令行执行工程:
打印结果:
简单的测试就到此为止,以后就开始按步骤编写目标网站的爬虫代码。