凡是过往,皆为序章

0%

Python爬虫_07(Scrapy初步使用)

本篇是python框架Scrapy的初步使用。


创建Scrapy爬虫工程

演示HTML页面地址:http://python123.io/ws/demo.html

文件名称:demo.html

创建步骤

应用Scrapy爬虫框架主要是编写配置型代码.

第一步

建立一个Scrapy爬虫工程。选取一个目录,cmd打开命令行运行下述代码:

1
scrapy startproject python123demo   # python123demo为工程名

生成的工程目录

  1. item.py:用来存储爬虫爬取下来的数据模型。
  2. middlewares.py:用来存放各种中间件的文件。
  3. pipelines.py:用来将items模型存储到本地磁盘中。
  4. settings.py:本爬虫的一些配置信息(比如请求头、多久发送一次请求、ip代理池等)
  5. scrapy.cfg:项目的 配置文件。
  6. spider文件夹:所有的爬虫代码文件。

其中spiders/ 目录下的内容为:(后续生成的demo.py便在此文件下)

第二步

在工程中产生一个Scrapy爬虫。进入工程目录(\python123demo目录下),然后执行如下命令:

1
scrapy genspider demo python123.io

该命令作用:

(1) 生成一个名称为demo的spider(不能与项目名一致)

(2) 爬取网站的url为 python123.io

(3) 在spiders目录下增加代码文件demo.py

该命令仅用于生成demo.py,该文件也可以手工生成.

demo.py文件

类名为DemoSpider(demo为自己命名的demo文件),且继承自 scrapy.Spider

name = “Demo”,当前爬虫名为Demo

allowed_domains: 是最开始在命令行中写入的域名,表示只能爬取该域名以下的相关链接

start_urls: 爬虫启动时最开始的url链接。是包含一个或多个url 的列表

parse:一个解析页面的空方法

第三步

设置settings.py,设置了两个地方,第一是不遵守robots.txt协议(设为False);第二是设置请求头,添加了user-agent选项。

第四步

配置产生的spider爬虫。主要是对demo.py文件的编写修改。(这里的案例以爬取相关网址,获得html,并存储在文件中作为演示)

配置:(1)初始URL地址 (2)获取页面后的解析方式

第五步

运行爬虫,获取网页

在命令行下,执行如下命令:

1
scrapy crawl demo

parse方法中:

  • fname = response.url.split('/')[-1],意为:从response响应中提取url,把最后的名字(即 ‘/’ 后的名字)作为待存储的本地文件名。

demo爬虫被执行,捕获页面存储在demo.html

demo.py代码的完整版本

demo.py两个等价版本的区别

yield关键字的使用

生成器每调用一次在yield位置产生一个值,直到函数执行结束.

为何要有生成器?

demo.py

Scrapy爬虫的基本使用

Scrapy爬虫的使用步骤

步骤1:创建一个工程和Spider模板

步骤2:编写Spider

步骤3:编写Item Pipeline:对Spider提取信息的后续处理做相关的定义

步骤4:优化配置策略

Scrapy爬虫的数据类型

注意:这里的request类和response类是Scrapy库的,和requests库的不是完全一致,但几乎相同。

Request类

class scrapy.http.Request()

Request对象表示一个HTTP请求,由Spider生成,由Downloader执行。

属性和方法

Response类

class scrapy.http.Response()

Response对象表示一个HTTP响应,由Downloader生成,由Spider处理。

属性和方法

Item类

class scrapy.item.Item()

Item对象表示一个从HTML页面中提取的信息内容

由Spider生成,由Item Pipeline处理

Item类似字典类型,可以按照字典类型操作

在scrapy爬虫中,Spider爬取网页,得到的信息以键值对的形式封装成字典,这种字典就是Item

Scrapy爬虫提取信息的方法

重点介绍CSS Selector的基本使用。

该方法在scrapy框架中十分常见,比较简单,需要掌握。

补充:Xpath

Xpath在Scrapy框架中常用。

Xpath语法

其实只分为3类

  • 层级:/直接子级,//跳级
  • 属性:@ 属性访问
  • 函数:contains()text()等。
    • contains():检测某个属性并不是完全等于某个值,而是包含某个值。
    • text():对标签内的文字结点进行提取。

在Scrapy中的应用

scrapy中支持Xpath的使用,response.xpath()直接调用即可。

案例:糗事百科,提取作者、文章详情页的url,和文章内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import scrapy
from urllib.parse import urljoin


class QsbkSpiderSpider(scrapy.Spider):
name = 'qsbk_spider'
allowed_domains = ['qiushibaike.com']
start_urls = ['http://qiushibaike.com/text/page/1/']

def parse(self, response):
# selectorList 类型
duanziDivs = response.xpath("//div[@class='col1 old-style-col1']/div")
for div in duanziDivs:
# div: Selector类型
# div.xpath():selectorList类型
author = div.xpath(".//h2/text()").get().strip()
# get()函数,取到第一个结果(str类型), get()<=>extract_first()
# extract(): 提取所有结果组成列表,每个元素是str类型
# strip(): 去掉前后的空格

href = div.xpath('./a/@href').get() # 获取a标签内的href的属性值
url = urljoin(self.start_urls[0],href) # 跳转到详情页

content = div.xpath(".//div[@class='content']//text()").extract()
# html中该div下有span标签,span中才是内容,//text()直接提取该内容

content = ''.join(content).strip()

tplt = "{0:{2}<20}\t{1:^50}"
print(tplt.format(author,url,chr(12288)))
print(content)
print('=' * 100)
~感谢你请我吃糖果~
-------------本文结束,感谢您的阅读,欢迎评论留言!-------------