尚硅谷爬虫note14
一、scrapy
scrapy:为爬取网站数据是,提取结构性数据而编写的应用框架
1. 安装
pip install scrapy
或者,国内源安装
pip install scrapy -i https://pypi.douban.com/simple
2. 报错
报错1)building ‘twisted.test.raiser’ extension
原因:缺少twisted库
解决:下载twisted库:
a)cp是python版本
b)amd是操作系统版本
安装twisted库:
使用:pip install 拖入twisted路径
twisted库安装完成后,再安装scrapy库
报错2)提示python -m pip install --upgrade pid
解决:运行python -m pip install --upgrade pid
报错3)win32错误
解决:pip install pypiwin32
仍然报错)
解决:安装Aanacoda工具
二、创建scrapy项目
1)创建scrapy项目
在终端中创建项目:
scrapy startproject 项目名
2)创建爬虫文件
在spiders文件夹中创建爬虫文件
a)切入spiders目录下:
cd 项目名\项目名\spiders
b) 在spiders文件夹中创建爬虫文件
scrapy genspider 文件名 要爬取的网页
一般情况下,要爬取的网页之前:不需要添加http协议
否则start-urls中的路径不成立
原因:start_urls的值是根据allowed_domains进行修改的,如果添加了http协议,allowed_domains的值需要用户手动修改
import scrapy
class Demo001Spider(scrapy.Spider):
# 爬虫的名字:用于运行爬虫时,使用的值
name = "demo001"
# 允许访问的域名
allowed_domains = ["www.baidu.com"]
# 起始url地址:指的是第一次要访问的域名
# start_urls是在allowed_domains之前添加1个http:// 在allowed_domains之后添加1个/
start_urls = ["http://www.baidu.com"]
#执行了 start_urls之后执行的方法 方法中的response就是返回的对象 相当于1)response = urllib.requests.urlopen() 2)response = requests.get()
def parse(self, response):
pass
3)运行爬虫文件
scrapy crawl 爬虫的名字
做了反扒————
解决:注释掉君子协议:项目下的setting.py文件中的robots.txt协议
注释掉:ROBOTSTXT_OBEY = True
三、scrapy项目结构
项目名
项目名
spider文件夹 (存储爬虫文件)
init
自定义的爬虫文件 (核心功能文件)
init
items (定义数据结构的地方)(爬取的数据包含哪些)
middleware (中间件)(代理)
pipelines (管道)(处理下载的数据)
settings (配置文件)
四、response的属性和方法
3)4)5)常用
1)response.text
获取响应的字符串
2)response.body
获取响应的二进制数据
3)response.xpath
直接使用xpath方法解析response中的内容
4)response.extract()
提取selector对象中的data属性值
5)response.extract_first()
提取selector对象的第一个数据
五、scrapy工作原理
1). 引擎向spiders要url
2). 引擎将要爬取的url给调度器
3). 调度器将url生成请求对象,放入指定的队列
4). 从队列中出队一个请求
5). 引擎将请求交给下载器进行处理
6).下载器发送请求,向互联网请求数据
7). 下载器将数据返回给引擎
8). 引擎将数据再次给到spiders
9).spiders通过xpath解析数据
10). spiders将数据,或者url,给到引擎
11). 引擎判断该数据,是数据,还是url
a)是数据,交给管道处理
b)还是url,交给调度器处理
六、scrapy shell
scrapy终端
测试xpath和css表达式
免去了每次修改后,运行spiders的麻烦
进入scrapy shell终端:
直接在Windows终端输入:scrapy shell 域名
使用:
终端中直接执行:
scrapy shell 域名
安装ipython(高亮,补全)
pip install ipython
七、懒加载中的src
有data-original,src用data-original替代
替换前:src = // ul[ @ id = "component_59"] / li // img / @ src
替换后:src = // ul[ @ id = "component_59"] / li // img / @ data-original
当当网练习中的第一张图片是none
原因:没有data-original
#有data-original,src用data-original替代
src = li.xpath('.//img/@data-original').extract_first()
# 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的 其他图片的地址是data-original
if src:
src = src
else:
#用src
src = li.xpath('.//img/@src').extract_first()
当当网:
items.py:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
from urllib import response
import scrapy
class DemoDdwItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# pass
#图片
# src = // ul[ @ id = "component_59"] / li // img / @ src
src = scrapy.Field()
#名字
# alt = // ul[ @ id = "component_59"] / li // img / @ alt
name = scrapy.Field()
#价格
# price = //ul[@id = "component_59"]/li//p[@class = "price"]/span[1]/text()
price = scrapy.Field()
ddw.py
import scrapy
class NddwSpider(scrapy.Spider):
name = "nddw"
allowed_domains = ["category.dangdang.com"]
start_urls = ["https://category.dangdang.com/cp01.07.30.00.00.00.html"]
def parse(self, response):
# pass
# src、name、price都有共同的li标签
# 所有的selector对象,都可以再次调用xpath方法
li_list = response.xpath('//ul[@id = "component_59"]/li')
for li in li_list:
# .extract()提取数据
# 有data-original,src用data-original替代
src = li.xpath('.//img/@data-original').extract_first()
# 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的 其他图片的地址是data-original
if src:
src = src
else:
# 用src
src = li.xpath('.//img/@src').extract_first()
alt = li.xpath('.//img/@alt').extract_first()
price = li.xpath('.//p[@class = "price"]/span[1]/text()').extract_first()
print(src, name, price)