1.爬虫必备的Python基础
1.1 字符串
字符串在爬虫
里. 必须要知道的几个操作:
-
索引和切片
s = "今天下好大的雨" print(s[1])# 天 print(s[0])# 今 # 从第2个, 到第4个(取不到4) print(s[2:4]) # 下好
-
strip()
我们从网页上提取的数据. 很多都是带有一些杂质的(换行, 空格),怎么去掉?
strip()可以去掉字符串
左右两端
的空白(空格, 换行\n, 回车\r, 制表符\t)s = " \t\t\t我的天哪\r\r \n\n " # 够乱的字符串 s1 = s.strip() print(s1) # 我的天哪
-
split(),分割字符串,在不传入参数的情况下默认以" "为分割值
s = "10,男人本色,100000万" # 你在网页上提取到这样的一段数据. 现在我需要电影名称 tmps = s.split(",") name = tmps[1] print(name) # 男人本色 id, name, money = s.split(",") # 切割后. 把三个结果直接怼给三个变量 print(id) print(name) print(money)
-
replace(),替换
s = "10,男人本色,100000万" s = s.replace("10","100") print(s) # 100 男人本色 100000万
-
join(),将列表拼接成一个字符串
lst = ["How","are","you"] res = " ".join(lst) print(res) # How are you
-
f-string.字符串的格式化输出
k = 10085 s2 = f"我的电话号是{k+1}" # 它会把计算结果赛入一个字符串 print(s2) # 我的电话号是10086
注意:在字符串中存在一个大坑,字符串的所有操作都不会改变原来的字符串,而是生成新的字符串,所以我们每次进行字符串操作的时候需要对返回值进行接收,不然我们很可能得不到我们想要的结果。
1.2列表
-
索引和切片
和字符串完全一致
-
增、删、查、改
lst = ["apple", "banana", "pear", "orange", "mango", "grape"] # 增加 print(lst) # ['apple', 'banana', 'pear', 'orange', 'mango', 'grape'] # 删除 lst.remove("banana") print(lst) # ['apple', 'pear', 'orange', 'mango', 'grape'] # 查找 print(lst[2]) # orange print(lst[-1]) # grape # 修改 lst[0] = "strawberry" print(lst) # ['strawberry', 'pear', 'orange', 'mango', 'grape']
-
循环列表
lst = ["apple", "banana", "pear", "orange", "mango", "grape"] # 循环列表 第一种方法 for i in range(0, len(lst)): print(lst[i]) # 循环列表 第二种方法 for fruit in lst: print(fruit)
注意:如果给出的索引下标超过了列表的最大索引,那么会报错, Index out of bounds,如果你给的下标是0,那么我们的爬虫并没有拿到内容,需要进行修改
1.3字典
-
增、删、查、改
dic = {"name": "小明", "age": 18, "sex": "男"} # 增加 print(dic) # {'name': '小明', 'age': 18, 'sex': '男'} # 修改 dic["sex"] = "女" print(dic) # {'name': '小明', 'age': 18, 'sex': '女'} # 删除 dic.pop("sex") print(dic) # {'name': '小明', 'age': 18} # 查找 print(dic.get("name")) # 小明 print(dic["name"]) # 这两种查找在字典中存在key时是一样的,但是在字典中不存在key时这种方法会报错 # 清空 dic.clear() print(dic) # {}
-
循环
dic = {"name": "小明", "age": 18, "sex": "男"} # 循环 for key in dic: print(key) # name age print(dic[key]) # 小明 18
-
嵌套
# 字典嵌套字典 dic = {"name": "小明", "age": 18, "sex": "男", "info": {"height": 170, "weight": 60}} # 访问内容 print(dic["info"]["height"]) # 170
1.4 字符集和bytes
记住常用的两种常用的字符集:一个是utf-8, 一个是gbk
字符串和bytes的相互转化:
# 把字符串转化成字节
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)
1.5文件操作
两种写法:
# 第一种
f = open(文件名, mode="模式", encoding='文件编码')
f.read()|f.write()
f.close() # 记住将打开的文件流关闭
# 第二种
with open(文件名, mode=模式, encoding=编码) as f:
pass
模式: 我们需要知道的主要有4个. 分别是: r, w, a, b
-
r 只读模式. 含义是, 当前这一次open的目的是读取数据. 所以, 只能读. 不能写
-
w 只写模式. 含义是, 当前这一次open的目的是写入数据. 所以, 只能写, 不能读
-
a 追加模式. 含义是, 当前这一次open的目的是向后追加. 所以, 只能写, 不能读
-
b 字节模式. 可以和上面三种模式进行混合搭配. 目的是. 写入的内容或读取的内容是字节.
1.6模块
模块是啥? 模块就是已经有人帮我们写好了的一些代码, 这些代码被保存在一个py文件或者一个文件夹里. 我们可以拿来直接用
在python中有三种模块.
第一种, python内置模块
不用安装. 直接导入就能用
第二种, 第三方模块
需要安装. 安装后. 导入就可以用了
第三种, 自定义模块(新手先别自己定义模块)
直接导入就能用
导入模块的语法
import 模块
from 模块 import 功能
from 模块.子模块 import 功能
举例子,
import os
import sys
from urllib.parse import urljoin
from bs4 import BeautifulSoup
搞爬虫.必须要了解的一些python内置模块
-
time模块
import time time.time() # 这个是获取到时间戳 time.sleep(999) # 让程序暂停999秒
-
os模块
import os # 判断文件是否存在 os.path.exists() # 判断文件或者文件夹是否存在 os.path.join() # 路径拼接 os.makedirs() # 创建文件夹
-
json模块(重中之重)
现在的网站不同于从前了. 习惯性用json来传递数据. 所以, 我们必须要知道json是啥, 以及python如何处理json.
json是一种类似字典一样的东西. 对于python而言, json是字符串.
例如,
s = '{"name": "jay", "age": 18}'
你看. 这破玩意就是
json
如何来转化它.
json字符串 => python字典
import json s = '{"name": "jay", "age": 18}' dic = json.loads(s) print(type(dic))
python字典 => json字符串
import json dic = {"name": "jay", "age": 18} s = json.dumps(dic) print(type(s))
-
random模块
随机. 没别的用处.生成随机数
import random i = random.randint(1, 10) # 1~10的随机数 print(i) # 多跑两次.效果更佳
2.爬虫入门
2.1什么是爬虫
我的理解:爬虫就是通过程序来模拟浏览器请求,帮助我们拿到我们在浏览器上能看到的东西
2.2为什么用python进行爬虫
Python是众多编程语言中, 小白上手最快, 语法最简单. 更重要的是, 这货有非常多的关于爬虫能用到的第三方支持库.
2.3第一个爬虫
在python中, 我们可以直接用urllib模块来完成对浏览器的模拟工作~, 直接上代码
from urllib.request import urlopen
resp = urlopen("http://www.baidu.com") # 打开 百度
print(resp.read().decode("utf-8")) # 打印 抓取到的内容
我们可以把抓取到的html内容全部写入到文件中, 然后和原版的百度进行对比, 看看是否一致
from urllib.request import urlopen
resp = urlopen("http://www.baidu.com") # 打开 百度
# print(resp.read().decode("utf-8")) # 打印 抓取到的内容
with open("baidu.html", mode="w", encoding="utf-8") as f: # 创建文件
f.write(resp.read().decode("utf-8")) # 保存在文件中
2.4使用requests模块进行爬虫
在前面小节中, 我们使用urllib来抓取页面源代码. 这个是python内置的一个模块. 但是, 它并不是我们常用的爬虫工具. 常用的抓取页面的模块通常使用一个第三方模块requests. 这个模块的优势就是比urllib还要简单, 并且处理各种请求都比较方便.
既然是第三方模块, 那就需要我们对该模块进行安装, 安装方法:
pip install requests
OK. 接下来我们来看看requests能带给我们什么?
我们将上面的代码换成requests试一试:
import requests
resp = requests.get("http://www.baidu.com") # 请求 百度
print(resp.text) # 打印响应内容
with open("baidu.html", mode="w", encoding="utf-8") as f: # 创建文件
f.write(resp.text) # 保存在文件中
3.总结
今天复习了python的基本语法,几种重要的数据类型,文件操作,字符集和模块等知识,了解了什么是爬虫,并开始写了第一个入门级爬虫。(收获满满,明天也要加油呀!)