- scrapy的基本使用
1.创建scrapy项目
scrapy创建项目和之前创建项目不一样,而是要在cmd终端中用指令创建对应的项目,首先选择创建项目的目录,如果我们还想将其放在之前代码的文件夹中就可以所在文件夹,然后在终端输入cd,将文件夹拖入终端中即可。之后我们就可以使用scrapy指令创建项目:scrapy startproject 项目名称,需要注意的是项目名称不允许使用数字开头,也不能包含中文
2.创建爬虫文件
我们要在spiders文件夹中创建爬虫文件,首先跳转到spiders文件中:(格式)cd 项目名称\项目名称\spiders,然后就可以创建爬虫文件:scrapy genspider 爬虫文件的名字 要爬取的网页,需要注意的是一般情况下要爬取的网页中不需要添加协议,因为start_urls中会自动拼接协议,这里做一下每个变量的解释
#爬虫的名字,用于运行爬虫时使用的值
name = "baidu"
#允许访问的域名
allowed_domains = ["www.baidu.com"]
#起始url地址,即第一次要访问的域名
#start_urls是在allowed_domains前面加一个http://,后面加一个/
start_urls = ["http://www.baidu.com/"]
#是执行力起始url之后执行的方法,相当于返回的response对象
#相当于response = urllib.request.urlopen(),相当于response = requests.get()
def parse(self, response):
pass
3.运行爬虫代码
格式:scrapy crawl 爬虫的名字,我们将方法中的pass改为print('前程似锦,未来可期')测试一下,但是从中断即运行结果看,好像没有得到这句话,猜测可能因为做了反爬,scrapy中有一个robot.txt君子协议,我们需要将settings中的ROBOTSTXT_OBEY = True这句话注释掉,注释掉再运行后就得到了这句话
- scrapy项目结构和基本方法
1.scrapy的项目结构
项目名字
项目名字
spiders文件夹 (存储的是爬虫文件)
init
自定义的爬虫文件
init
items 定义数据结构的地方,是一个继承自scrapy.Item的类 爬取的数据包含哪些
middlewares 中间件 代理
pipelines 管道 里面只有一个类,用于处理下载数据的后续处理
settings 配置文件 比如:是否遵守robots协议,User‐Agent定义等
2.scrapy基本方法
这里我们通过58同城项目对scrapy项目结构和基本方法进行学习,首先选择创建目录创建scrapy项目,然后创建爬虫文件,但创建后会出现以下提示,是因为url中某些特殊接口名的原因,但因为文件已经创建成功,所以不影响使用。 接下来就是删除start_urls中自动拼接的协议并注释掉君子协议
然后我们就要获取网页数据:content = response.text (获取响应的字符串数据)
content = response.body(获取响应的二进制数据)
response.xpath(直接使用xpath解析response中的内容)
response.extract()(提取seletor对象的data属性值)
response.extract()_first(提取seletor列表的第一个数据)
但在用xpath解析response中内容时得到的是一个空列表,尝试多个xpath路径后结果都是空列表,但使用xpath插件能得到数据,应该不是路径问题,在尝试用urllib方法时却能得到想要的数据,经过后面的案例中我注意到虽然我在创建爬虫文件时复制的url很长,但在pycharm自定义的爬虫文件中却非常短,将其复制到浏览器中发现只是跳转到首页,将爬虫文件中的url手动修改后得到了想要的数据
我们再通过汽车之家的案例加强一下后面几个方法的学习,并以此理解scrapy的工作原理。视频中按照前几步终端操作完成后尝试运行爬虫,发现没有执行,首先想到的是注释掉settings中的协议,但注释掉后发现还是没有执行,查找原因后发现是因为视频中的url后缀是html,如果你的请求接口url是以html结尾时不允许加/。然后在网页中找到我们想要爬取数据的xpath路径,可以借助xpath插件,运行后发现得到是一个selector列表,既然是列表我们就可以用for循环遍历并提取data数据
name_list = response.xpath('//div[@class="brand-rec-box"]//a[@class="name hoveraddunderline"]/@title')
print(name_list)
for name in name_list:
print(name.extract())
name_list = response.xpath('//div[@class="brand-rec-box"]//a[@class="name hoveraddunderline"]/@title')
price_list = response.xpath('//div[@class="brand-rec-box"]//a[@class="price hoveraddunderline"]/text()')
for i in range(len(name_list)):
name = name_list[i].extract()
price = price_list[i].extract()
print(name,price)
- scrapy工作原理
(1)引擎向spiders要url
(2)引擎将要爬取的url给调度器
(3)调度器会将url生成的请求对象放入到指定的队列中找
(4)从队列中出队一个请求
(5)引擎将请求交给下载器处理
(6)下载器发送请求获取互联网数据
(7)下载器将数据返回给引擎
(8)引擎将数据再次给到spiders
(9)spiders通过xpath解析该数据,得到数据或者url
(10)spiders将数据或者url给到引擎
(11)引擎判断url是url还是数据,url交给调度器处理,数据交给管道处理