文章目录
一、复习bs4
xpath:记语法、copy (full) xpath
bs4:(三大种类操作)
- 遍历
- 父、长辈们
- 上、下兄弟(们)
- 子、晚辈们
- 查找
- “搜索文档树”(以后再看)
- find/find_all [元素、属性值、字符串]
- 修改
第十讲的select()、修改文档树(以后再看)
补充:
Comment : 注释
html = '<a><!--大家慢慢来,好饭不怕晚,先把知识点掌握--></a>'
soup2 = BeautifulSoup(html,'lxml')
print(type(soup2.string)) # <class 'bs4.element.Comment'>
二、selenium之前
爬取数据(包括解析)
- selenium爬取数据
- selenium中的page_source+(三个方法)
- requests+(三个方法)
其中(三个方法 指正则、xpath、bs4)
selenium输入信息的方式:
- send_keys类
- 下拉框
- 执行js
补充:
行为链–进行封装
加快速度–无界面
基本–定位+操作
反爬–页面等待
三、大总结(细节)
3.1settings.py修改
- False,UA,WARNING
- 管道 普通;保存图片时
- 保存图片时:加上
ITEM_PIPELINES = {
# 'audi.pipelines.AudiPipeline': 300,
'scrapy.pipelines.images.ImagesPipeline':1 #固定写法
}
import os
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images') #IMAGES_STORE不能改
- 并发(多线程数量) DELAY
3.2UA设置
- settings 普通设置
- 下载中间件
3.3反爬
- 设置UA
- 设置delay
3.4运行不成功
- URL yield
- items
- settings
3.5翻页
- 普通:(转入平行的网址)
可以找页数的规律
直接找下一页的Url地址 然后 yield scrapy.Request(url,callback=None) - 转入子页
看看检查里是否有现成的、找规律
3.6保存图片
方式一:
import os
from scrapy.pipelines.images import ImagesPipeline
from urllib import request
class AudiPipeline:
def process_item(self, item, spider):
# 获取图片的url
src = item['src']
# 获取图片的名字
img_name = item['src'].split("__")[-1]
# 动态的添加这个路径(目录)
file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'images')
print(img_name)
# request.urlretrieve专门用来保存二进制文件
request.urlretrieve(src, file_path + '/' + img_name)
return item
方式二:
下载图片的 Images Pipeline
使用images pipeline下载文件步骤:
• 定义好一个Item,然后在这个item中定义两个属性,分别为image_urls以及images。image_urls是用来存储需要下载的文件的url链接,需要给一个列表
• 当文件下载完成后,会把文件下载的相关信息存储到item的images属性中。如下载路径、下载的url和图片校验码等
• 在配置文件settings.py中配置IMAGES_STORE,这个配置用来设置文件下载路径
• 启动pipeline:在ITEM_PIPELINES中设置scrapy.pipelines.images.ImagesPipeline:1
四、settings.py文件的补充
settings.py文件可以作为配置项 变量大写表示公共、配置
用于连接外部与scrapy 编程时不知把一些逻辑(简单)放哪里,可以放settings.py文件中
五、hashlib (一种加密方式)
import hashlib
h = hashlib.sha1()
print(h)
h.update('hello'.encode('utf-8'))
print(h.hexdigest()) # hexdigest() 返回的是十六进制的字符串
六、类知识点回顾
class A:
# 类属性 直接在类中定义的属性就是类属性
# 类属性可以通过类或类的实例来访问,无法通过实例对象来修改
count = 3
def __init__(self):
# 实例属性,通过实例对象添加的属性都是实例属性
# 实例属性 只能通过实例对象来访问和修改,类对象无法访问和修改
self.name = '葫芦娃'
# 实例方法
# 在类中定义,以self为第一个参数的方法都是实例方法
# 通过实例对象来调用,会自动将当期对象作为self传入 a.test()
# 当通过类对象来调用,不会自动传递self。此时我们必须手动传递self
def test(self):
print('我是实例方法....')
# 类方法
# 在类的内容部 使用@classmethod 来修饰的方法就是类方法
# 类方法的第一个参数是cls 也会被自动传递 cls就是当前的类对象
# 类方法可以通过类来调用也可以通过类的实例来调用,没有区别
@classmethod
def test2(cls):
print('我是类方法....')
a = A()
# a.count = 100 # 实例属性 注意:当使用实例对象对类方法进行赋值时,a这个实例对象也拥有的实例属性count
A.count = 1
print('A',A.count)
print('a',a.count)
# print('a',a.name)
# print('A',A.name) # AttributeError: type object 'A' has no attribute 'name'
# a.test() 等价于 A.test(a)
# a.test()
# A.test(a)
# A.test2() 等价于 a.test2()
# A.test2()
# a.test2()