一:Scrap Shell
运行在终端的工具,用来调试scrapy。可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式。
简单使用—糗事百科
scrapy shell “http://www.baidu.com/”
scrapy shell -s USER_AGENT='Mozilla/5.0'
fetch(‘url’)
A-response对象
属性
text:字符串格式的html
body:二进制格式的html
url:所请求的url
status:响应的状态码
方法:
xpath(): 根据xpath路径获取符合的路径所有selector对象
(是scrapy内部封装的一个类的对象)的列表
例:获取糗事百科用户名
response.xpath('//div[@class="author clearfix"]//img/@alt')
css():获取符合要求的所有selector对象的列表
获取内容
name_list=response.css('#content-left a > h2::text')
获取属性
css_list=response.css('#content-left a > img::attr(src)')
接着extract()即可一般不使用,
因为中间scrapy会将这个选择器给翻译成xpath再去解析
selector对象
xpath('./'): 从当前节点向下开始查找
css(): 和上面的response的方式一样
extract(): 将对象转化为unicode字符串
extract_first(): 如果xpath没有获取到内容,
extract_first()会返回None,extract()会报错
B-item对象
类字典对象,用法和字典一模一样
将这个对象转化为字典 stu = dict(stu)
二: yield item和请求
yield 示例-1
2-校花网 http://www.xiaohuar.com/hua/
【温馨提示】写好pipeline的时候,需要在settings文件中打开一个配置
ITEM_PIPELINES = {
'huaproject.pipelines.HuaprojectPipeline': 300,
}
第一个:处理的管道
第二个:优先级,越小优先级越高(1-1000)
*****************************************************************
实现单个页面图片下载
多页面抓取
url规律
第一页 list-1-0.html
第二页 list-1-1.html
第n页 list-1-(n-1).html
三:请求传参(高级请求)
假如一个页面不能将一个item的所有信息全部拿到,
需要再次发送一次请求,再次解析才能将item的所有信息拿到。
一:crawl spider
CrawlSpider是一个类,父类是scrapy.Spider。
CrawlSpider不仅有Spider的功能,还有自己独特功能
特有功能:CrawlSpider可以定义规则,解析html时可根据链接规则
提取出指定链接,然后再向这些链接发送请求。
通常用于:如果有需要跟进链接的需求,爬取网页之后,需要提取链接再次爬取。
如何提取链接?
链接提取器,在这里就可以写规则提取指定链接
scrapy.linkextractors.LinkExtractor(
allow = (), # 正则表达式 提取符合正则的链接
deny = (), # (不用)正则表达式 不提取符合正则的链接
allow_domains = (), # (不用)允许的域名
deny_domains = (), # (不用)不允许的域名
restrict_xpaths = (), # xpath,提取符合xpath规则的链接
retrict_css = () # 提取符合选择器规则的链接)
【案例】:电影天堂-提取所有页码链接
scrapy shell http://www.dytt8.net/html/gndy/dyzz/index.html
from scrapy.linkextractors import LinkExtractor
正则用法
links1 = LinkExtractor(allow='list_23_\d+\.html')
links1.extract_links(response) 查看提取到的所有链接
------------------------------------------------------------------------
xpath用法
links2 = LinkExtractor(restrict_xpaths='//div[@class="x"]')
【注意】这里的xpath不带a
css用法
links3 = LinkExtractor(restrict_css='.x') 【注意】这里的选择器不带a
【案例】:读书网-散文随笔
https://www.dushu.com/book/1163.html
scrapy startproject readbook1
scrapy genspider -t crawl readbook www.dushu.com
crawlspider运行原理:
【实操-spiders注意说明】
rules = (Rule(LinkExtractor(allow=r'/book/1163_\d+\.html')
, callback='parse_item', follow=False),)
【注1】callback只能写函数名字符串, callback='parse_item'
【注2】在基本的spider中,如果重新发送请求,那里的callback写的是 callback=self.parse_item
*********************************************************************
二:日志信息和日志等级
级别:
CRITICAL:严重错误
ERROR:一般错误
WARNING:警告
INFO: 一般信息
DEBUG:调试信息
默认的级别为DEBUG,会显示上面所有的信息
在配置文件中 settings.py设置
LOG_LEVEL : 设置日志显示等级,此举动决定了显示哪些,不显示哪些
LOG_FILE : 将屏幕显示的信息记录到文件中,屏幕不再显示
三:Request和response总结
Request(类)
get请求
scrapy.Request(url=url,callback=self.parse_item,meta={'item':item}, headers=headers)
url: 要请求的地址
callback:响应成功之后的回调函数
meta: 参数传递
headers: 定制头信息,一般不用
response(对象)
response.text: 字符串格式文本
response.body: 二进制格式文本
response.url: 当前响应的url地址
response.status: 状态码
response.xpath(): 筛选想要的数据
response.css(): 筛选想要的数据
post请求
【温馨提示】
如果直接发送post请求,start_urls和parse方法就用不到
因为重写了start_requests(self)这个方法,
【案例】:百度翻译
scrapy.FormRequest(url=url, headers=headers, callback=self.parse_item
, formdata=data)
url: 要发送的post地址
headers:定制头信息
callback: 回调函数
formdata: post所携带的数据【字典】
四:代理
通过下载中间件来进行添加
(1)到settings.py中,打开一个选项
DOWNLOADER_MIDDLEWARES配置选项
(2)到middlewares.py中找到以下方法写代码
def process_request(self, request, spider):
request.meta['proxy'] = 'https://113.68.202.99:8888'
return None
------------------------------------------------------------------------
五:scrapy实现模拟登录
【案例】豆瓣-douban
https://accounts.douban.com/login
【温馨提示】
Douban基于安全考虑-比较靠谱的网站,登录时需携带Cookie。
所以需要首先向登录地址发送get请求,然后再向post地址发送post请求,因为中间要携带cookie,才能登录成功
请求模式【get==>post==>get】
六:存储到mysql中
【案例】-读书项目
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
*********************************************************************
网友评论