前言:学习scrapy框架的一些网站:
https://github.com/GuanLdong/QidianScrapy
一.创建工程
- 新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
- 明确目标 (编写items.py):明确你想要抓取的目标
- 制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
- 存储内容 (pipelines.py):设计管道存储爬取内容
- scrapy.cfg: 项目的配置文件。
- mySpider/: 项目的Python模块,将会从这里引用代码。
- mySpider/items.py: 项目的目标文件。
- mySpider/pipelines.py: 项目的管道文件。
- mySpider/settings.py: 项目的设置文件。
- mySpider/spiders/: 存储爬虫代码目录。
学习xpath:
1,可以在网站上搜一些教程,基础知识点需要掌握;
//表示越级
/表示子级
@选择属性
2,例如一个xpath匹配式子:
//div[@class="Oprah"']/tr//a/text()
表示在一个class为Oprah的div下的子标签为tr越级标签为a的文本
3,同时可以利用浏览器自带的xpath直接进行复制粘贴就可以了,但是在有些情况下会失效,所以要加以调试.
4,时刻查看用scrapy输出的HTML代码,不然有些情况下请求过于频繁网站可能发现了爬虫,所以进行验证码验证.所以我们的xpath会为空
5,除了xpath选择器还有css选择器,re正则,bs4
scrapy的使用:
1,创建工程与项目
1),需要在相应的目录下打开cmd输入一下命令:
scrapy startproject mingyan
2),根据提示cd进入下层目录进行创建项目:
scrapy startproject taobao
2,完成项目创建之后进行项目的配置:
1),进入settings.py目录下:
LOG_LEVEL = 'WARN' 实现过滤的功能
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 QIHU 360SE'
请求头,让网站识别出发请求的是人,不是爬虫,通俗一点就是伪装自己.
ROBOTSTXT_OBEY = False 不遵循网站的爬虫协议,如果遵循的话会有很多东西爬取不出来.
ITEM_PIPELINES = {
'baidu.pipelines.BaiduPipeline': 300,
} 开启中间件
3,完成爬虫的逻辑代码:
1,基础代码有一下几个内容:
1),查看在代码中输出的HTML
res = requests.get('https://www.enterdesk.com/')
print(res)
2),取出获得的列表中的第一个元素:extract_fist()
3),取出获得的列表中的全部元素:extract()
4),Python中的循坏语句:(for....in...:)
1):假设有一个列表list = [1,2,3,4,5,6]
2):v在这个列表里,并且想把列表里的元素全部遍历出来可以这样写:
for v in list:
print(v)
5),爬虫逻辑实现:(这里用到的提取方法是css提取器)
mingyan = response.css('div.quote') # 提取首页所有名言,保存至变量mingyan
for v in mingyan: # 循环获取每一条名言里面的:名言内容、作者、标签
text = v.css('.text::text').extract_first() # 提取名言
autor = v.css('.author::text').extract_first() # 提取作者
tags = v.css('.tags .tag::text').extract() # 提取标签
tags = ','.join(tags) # 数组转换为字符串
# 接下来,进行保存
fileName = '%s-语录.txt' % autor # 定义文件名,如:木心-语录.txt
with open(fileName, "a+") as f: # 不同人的名言保存在不同的txt文档,“a+”以追加的形式
f.write(text)
f.write('\n') # ‘\n’ 表示换行
f.write('标签:' + tags)
f.write('\n-------\n')
f.close()
2,数据匹配的学习,这里我们介绍的是xpath选择器:
1),xpath选择器浏览器自带,可以直接粘贴复制,但是有一些需要修改,所以我们简单的学习一下基础常用的部分就可以了.
2),主要由
//表示越级选取比如HTML的结构为:html>>body>>div class = 'header'>>div class='floot'>>a
//可以跳级选取 /必须是某级的子标签
@选取属性
学习到这里我们可以进行一页数据的爬取,但是爬去一页,两页可以,要是爬取一百页,一千页呢....接下来我们学习一页一页的进行爬取.
3,下面的内容十分重要:
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
第一行查看有没有存在下一页的连接.
第二行判断
第三行如果存在,就用response.urljoin把相对路径转化为绝对路径
第三行这里的scrapy.Request()可以传递多个参数,这里只讲两个.next_page是爬取下一页的内容,callback是用那个函数爬取,这里我们使用的是parse,这样就实现了一直爬取直到把数据爬完.
4,scrapy的参数问题
def start_requests(self):
url = 'http://lab.scrapyd.cn/'
tag = getattr(self, 'tag', None) # 获取tag值,也就是爬取时传过来的参数
if tag is not None: # 判断是否存在tag,若存在,重新构造url
url = url + 'tag/' + tag # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
yield scrapy.Request(url, self.parse) # 发送请求爬取参数内容
设置参数的原因,(1),方便可以不用再更改代码,比如可以爬完所有的标签
参数设置完成之后:在cmd执行
scrapy crawl argsSpider -a tag=爱情
scrapy crawl argsSpider -a tag=励志
5,运行爬虫scrapy crawl mingyan2