Python爬虫必备知识点--整理核心基础
Python爬虫基础语法相关
1. if条件判断
if 条件:
事情1
else:
事情2
2. while循环
while 条件:
循环体
3. 关于True和False
几乎所有能表示为空的东西. 都可以认为是False
print(bool(0))
print(bool(""))
print(bool([]))
print(bool({}))
print(bool(set()))
print(bool(tuple()))
print(bool(None))
4. 字符串
A. 索引和切片
索引, 就是第几个字符. 它从0开始.
切片, 从字符串中提取n个字符.
s = "我爱你"
print(s[1]) # 爱
print(s[0]) # 我
print(s[2:4]) #从第2个, 到第4个(取不到4) --你
B. strip()
strip()可以去掉字符串左右两端的空白(空格, 换行\n, 回车\r, 制表符\t)
s = " \t\t\t 是的士大夫为我\r\r \n\n " # 够乱的字符串
s1 = s.strip()
print(s1) # 是的士大夫为我
C. split()
做切割的
s = "10,男人本色,100000万" # 你在网页上提取到这样的一段数据. 现在我需要电影名称
tmps = s.split(",")
name = tmps[1]
print(name) # 男人本色
id, name, money = s.split(",") # 切割后. 把三个结果直接怼给三个变量
print(id)
print(name)
print(money)
D. replace()
replace, 字符串替换
s = "的 \t\t\n\n属地往 32 师弟 "
s1 = replace(" ", "").replace("\t", "").replace("\n", "")
E. join()
lst = ["我妈", "不喜欢", "黎明"] # 有时,由于网页结构的不规则, 导致获取的数据是这样的.
s1 = "".join(lst) # 用空字符串把lst中的每一项拼接起来
print(s1) # 我妈不喜欢黎明
lst2 = ["\n\r","\n\r","周杰伦\n\r", "\n不认识我\r"]
s2 = "".join(lst2).replace("\n", "").replace("\r", "")
print(s2) # 周杰伦不认识我
F. f-string
s = "周杰伦"
s1 = f"我喜欢{s}" # 它会把一个变量塞入一个字符串
print(s1) # 我喜欢周杰伦
k = 10085
s2 = f"我的电话号是{k+1}" # 它会把计算结果赛入一个字符串
print(s2) # 我的电话号是10086
# 综上, f-string的大括号里, 其实是一段表达式.能计算出结果即可
5. 列表
A. 索引, 切片
列表的索引和切片逻辑与字符串完全一致
lst = ["赵本山", "王大陆", "大嘴猴", "马后炮"]
item1 = lst[2] # 大嘴猴
item2 = lst[1] # 王大陆
lst2 = lst[2:]
print(lst2) # ["大嘴猴", "马后炮"]
# 注意, 如果列表中没有数据. 取0会报错
lst = []
print(lst[0]) # 报错, Index out of bounds
# 注意, 如果给出的索引下标超过了列表的最大索引. 依然会报错
lst = ["123", "456"]
print(lst[9999]) # 报错, Index out of bounds
B. 增加
给列表添加数据.
lst = [11,22]
lst.append(33)
lst.append(44)
print(lst) # [11,22,33,44]
C. 删除
lst.remove("周润发")
D. 修改
lst = ["赵本山", "王大陆", "大嘴猴", "马后炮"]
lst[1] = "周杰伦"
print(lst) # ["赵本山", "周杰伦", "大嘴猴", "马后炮"]
E.range和查询
for i in range(len(lst)):
print(lst[i])
# 循环列表的内容
for item in lst:
print(item)
6. 字典
A. 增加/修改/删除
dic = {}
dic['name'] = '樵夫'
dic['age'] = 18
print(dic) # {"name": "樵夫", "age": 18}
dic = {"name": "樵夫", "age": 18}
dic['age'] = 19
print(dic) # {"name": "樵夫", "age": 19}
dic = {"name": "樵夫", "age": 18}
dic.pop("age")
print(dic) # {'name': '樵夫'}
B. 查询
dic = {"name": "樵夫", "age": 18}
a = dic['name'] # 查询'name'的值
print(a) # 樵夫
b = dic['age'] # 拿到dic中age对应的值
print(b) # 18
c = dic['哈拉少'] # 没有哈拉少. 报错
d = dic.get("哈拉少") # 没有哈拉少, 不报错. 返回None. 它好. 它不报错
嵌套!!
dic = {"name": "樵夫", "age": 18}
for k in dic: # 循环出所有的key
print(k)
print(dic[k]) # 获取到所有的value并打印
dic = {
"name": "王峰",
"age": 18,
"wife": {
"name": "章子怡",
"age": 19,
},
"children": [
{'name':"胡一菲", "age": 19},
{'name':"胡二菲", "age": 18},
{'name':"胡三菲", "age": 17},
]
}
# 王峰的第二个孩子的名字
print(dic['children'][1]['name'])
# 王峰所有孩子的名称和年龄
for item in dic['children']:
print(item['name'])
print(item['age'])
7.字符集和bytes
字符集方面,在选择时只需掌握两个编码方案就足够了。这两个方案分别是UTF-8和GBK,在处理中文字符时都可正常工作;但是从编码总数上看,在GBK之外UTF-8所包含的编码总数要大得多;如今,在各种应用中使用最多的编码方案无非就是UTF-8
# 把字符串转化成字节
bs = "我的天哪abcdef".encode("utf-8")
print(bs) # b'\xe6\x88\x91\xe7\x9a\x84\xe5\xa4\xa9\xe5\x93\xaaabcdef'
# 一个中文在utf-8里是3个字节. 一个英文是一个字节. 所以英文字母是正常显示的
# 把字节还原回字符串
bs = b'\xe6\x88\x91\xe7\x9a\x84\xe5\xa4\xa9\xe5\x93\xaaabcdef'
s = bs.decode("utf-8")
print(s)
记住, bytes并非供人类阅读, 而是供机器理解. 在计算机系统中, 所有的信息——无论是文本、图片、音频还是视频——最终都被表示为字节形式. 我们处理的所有内容——文字、图片、音频与视频等——在经过计算机处理后都会以统一的基本单位字节形式存在. 因此,在计算机内部存储和处理的所有信息都以统一的基本单位字节形式存在.
8. 文件操作
python中. 想要处理一个文件. 必须用open()先打开一个文件
f = open(文件名, mode="模式", encoding='文件编码')
f.read()|f.write()
f.close()
模式:
我们需要知道的主要有4个. 分别是: r, w, a, b
1. r只读方式。其意义在于,在本次操作中打开文件的目的仅限于读取数据。因此,在这种情况下只能执行read操作而非write操作。
2. w只写方式。其意义在于,在本次操作中打开文件的目的仅限于进行数据write操作。
3. a追加方式。其意义在于,在本次操作中打开文件的目的仅限于向后追加内容。
4. b字节方式可以与上述三种方式进行混合配置。其实现目标在于:所处理的数据是以字节形式进行存储或传输。
encoding: file encoding. 仅限于处理文件为文本时才可用. 此外mode不支持选项b. 大约99%的时间采用的是utf-8编码.
with open(文件名, mode=模式, encoding=编码) as f:
pass
with open("躺尸一摆手.txt", mode="r", encoding="utf-8") as f:
for line in f: # for循环可以逐行的进行循环文件中的内容
print(line)
这种写法的好处是, 不需要我们手动去关闭f
9. 关于函数
def get_page_source(url):
print("我要发送请求了. 我要获取到页面源代码啊")
return "页面源代码"
pg_one = get_page_source("baidu.com")
pg_two = get_page_source("koukou.com")
def download_image(url, save_path):
print(f"我要下载图片{url}了", f"保存在{save_path}")
donwload_image("http://www.baidu.com/abc/huyifei.jpg", "胡二飞.jpg")
donwload_image("http://www.baidu.com/aaa/dagedagefeifeifei.jpg", "大哥大哥飞飞飞.jpg")
10. 关于模块
第一种, python内置模块
不用安装. 直接导入就能用
第二种, 第三方模块
需要安装. 安装后. 导入就可以用了
第三种, 自定义模块(新手先别自己定义模块)
直接导入就能用
导入模块的语法
import 模块
from 模块 import 功能
from 模块.子模块 import 功能
import os
import sys
from urllib.parse import urljoin
from bs4 import BeautifulSoup
A. time 模块
B. os模块
C. json模块
D. random模块
import time
time.time() # 这个是获取到时间戳
time.sleep(999) # 让程序暂停999秒
import os
# 判断文件是否存在
os.path.exists() # 判断文件或者文件夹是否存在
os.path.join() # 路径拼接
os.makedirs() # 创建文件夹
import json
s = '{"name": "jay", "age": 18}'
dic = json.loads(s) #json字符串 => python字典
print(type(dic))
import json
dic = {"name": "jay", "age": 18}
s = json.dumps(dic) #python字典 => json字符串
print(type(s))
import random
i = random.randint(1, 10) # 1~10的随机数
print(i) # 多跑两次.效果更加
E. 异常处理
例如,在尝试访问某个网站时
我们需要明确一个事实:当我们访问网站时(如果长时间未响应或加载速度较慢),我们通常会主动进行页面刷新(对吗)。这类似于:当程序在本次请求中失败时能否再试一次?好的,在接下来的部分中我们将讨论如何处理这种异常情况。
try: # 尝试...
print("假如, 我是一段爬虫代码, 请求到对方服务器")
print("我得出事儿啊")
print(1/0) # 出事儿了
except Exception as e: # 出错了. 我给你兜着
print(e) # 怎么兜? 打印一下. 就过去了
print("不论上面是否出错. 我这里, 依然可以执行")
while 1:
try:
我要发送请求了. 我要干美国CIA的总部. 我要上天
print("我成功了!!")
break # 成功了.就跳出循环
except Exception as e:
print("失败了")
print("我不怕失败")
print("再来")
import time
for i in range(10):
try:
我要发送请求了. 我要干美国CIA的总部. 我要上天
print("我成功了!!")
break # 成功了.就跳出循环
except Exception as e:
print("失败了")
print("我不怕失败")
print("再来")
time.sleep(i * 10)
