最近在工作中有需要使用到爬虫的地方,需要根据 Gitlab + Python 实现一套定时爬取数据的工具,所以借此机会,针对 Python 爬虫方面的知识进行了学习,也算 Python 爬虫入门了。
需要了解的知识点:
下面针对上面的每部分做个简单的介绍。
小编给大家整理了全套Python爬虫入门资料,点击下方链接或者扫描二维码直接领取。
2\. Python 基础语法 ---------------最新全套【Python入门到进阶资料 & 实战源码 &安装工具】(安全链接,放心点击)
学习任何一门编程语言都必须掌握其语法知识,Python 也不例外。如果有其它变成语言基础,上手 Python 还是非常快的。
在 Python 中,定义一个变量的操作分为两步:首先要为变量起一个名字,称为变量的命名;然后要为变量指定其所代表的数据,称为变量的赋值。这两个步骤在同一行代码中完成。
version = '1'
Python 中的变量命名规范与其它开发语言差不多,基本的规则如下:
Python 中有 6 种基本数据类型:数字(Numbers)、字符串(String)、列表(List)、字典(Dictionary)、元组(Tuple)和集合。
在 Python 中定义变量后需要及时指明对应的数据类型。同时也可以使用 del 变量名 删除对象引用。
num = 0
pi = 3.14
name = "abc"
# 定义列表 [],列表元素可以修改
list = [12, 2, 212, 44, 5, 6]
dic = {
"k1": "v1",
"k2": "v2",
}
# 集合类型用 set 标识, 创建使用 { } 或者 set()
s1 = {1, 2, 3, 3, 2, 2, 2, 1, "1"}
# 元组用 () 表示,元组的元素不能修改
tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )
del s1
对于每种数据类型,都有一些常用的方法:
数据类型 | 方法 |
---|---|
字符串 | |
- [ : ]:截取字符串中的一部分(切片),遵循左闭右开原则; | |
- []:通过索引获取字符串中字符; | |
- in:如果字符串中包含给定的字符返回 True; | |
- not in:成员运算符 - 如果字符串中不包含给定的字符返回 True | |
- capitalize():将字符串的第一个字符转换为大写; | |
- endswith(suffix, beg=0, end=len(string)):检查字符串是否以指定的字符串结束,如果是,返回 True,否则返回 False; | |
- find(str, beg=0, end=len(string)):检测 str 是否包含在字符串中,如果包含,返回开始的索引值,否则返回-1; | |
- index(str, beg=0, end=len(string)):跟find()方法一样,只不过如果str不在字符串中会报一个异常; | |
- len(string):返回字符串长度; | |
- replace(old, new [, max]):把将字符串中的 old 替换成 new,如果 max 指定,则替换不超过 max 次; | |
- rstrip():删除字符串末尾的空格或指定字符; | |
- split(str=“”, num=string.count(str)):以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串。 | |
列表/元组 | |
- len(list):列表元素个数; | |
- list(seq):将序列(元组,集合等)转换为列表; | |
- list.append(obj):在列表末尾添加新的对象; | |
- list.index(obj):从列表中找出某个值第一个匹配项的索引位置; | |
- list.remove(obj):移除列表中某个值的第一个匹配项; | |
- list.clear():清空列表。 | |
字典 | |
- len(dict):计算字典元素个数,即键的总数; | |
- key in dict:如果键在字典dict里返回true,否则返回false; | |
- radiansdict.items():以列表返回可遍历的(键, 值) 元组数组; | |
- radiansdict.keys():以列表返回一个字典所有的键; | |
- radiansdict.values():以列表返回字典中的所有值。 | |
字符串类型转换通过 str() 函数可以将一个变量转换为字符串类型。
在 Python 中运算符基本与其它开发语言一致,常用的运算符有算术运算符、字符串运算符、比较运算符、赋值运算符和逻辑运算符。
算术运算符
比较运算符
逻辑运算符
Python 的控制语句分为条件语句和循环语句,前者为 if 语句,后者为 for 语句和 while 语句。
if 语句主要用于条件判断,满足特定条件执行语句。
if 条件: # 注意不要遗漏冒号
代码1 # 注意代码前要有缩进
else: # 注意不要遗漏冒号
代码2 # 注意代码前要有缩进
一个简单的示例:
grade = 60
if grade >= 60:
print("及格")
else:
print("不及格")
for 语句常用于完成指定次数的重复操作
for i in 序列: # 注意不要遗漏冒号
要重复执行的代码 # 注意代码前要有缩进
简单示例:
numbers = [12, 2, 212, 44, 5, 6]
for item in numbers:
print(item)
while 语句用于在指定条件成立时重复执行操作。
while 条件: # 注意不要遗漏冒号
要重复执行的代码 # 注意代码前要有缩进
简单示例:
a = 60
while a < 70:
print(a)
a = a + 1
Python 提供了诸多的内置函数,比如 str()、int() 等,但是在开发时,也需要经常用到自定义函数。
在 Python 中使用 def 关键字定义一个函数。
def 函数名(参数):
实现函数功能的代码
如果需要返回值,则需要使用 return 进行返回。
def data_transform():
# 具体的实现逻辑
return True
要使用模块,就需要安装和导入模块。模块的两种导入方法:import 语句导入法和 from语句导入法。
import math # 导入math模块
import turtle # 导入turtle模块
from math import sqrt # 导入math模块中的单个函数
from turtle import forward, backward, right, left # 导入turtle模块中的多个函数
模块的安装使用 pip install 指令:
pip install "SomeProject"
爬虫肯定需要了解基础的网络请求和基础的 HTML 知识,能够认识基础的 HTML 标签。
requests 包可以模拟浏览器发起 HTTP 或 HTTPS 协议的网络请求,从而获取网页源代码。
使用也比较简单,先安装模块:pip3 install requests.
get 请求
比如抓取百度首页的信息。
import requests
response = requests.get(url='https://www.baidu.com')
print(response.text)
输出如下:
**post **请求
# 测试请求地址
req_url = "https://juejin.org/post"
# 表单数据
formdata = {
'username': 'admin',
'password': 'a123456',
}
# 添加请求头
req_header = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
# 发起请求
response = requests.post(
req_url,
data=formdata,
headers=req_header
)
print(response.text)
通过 requests 模块发送网络请求,非常简单,容易上手。
BeautifulSoup 模块是一个 HTML/XML 解析器,主要用于解析和提取 HTML/XML 文档中的数据。该模块不仅支持 Python 标准库中的 HTML 解析器 lxml,而且支持许多功能强大的第三方解析器。
在使用前先通过 pip 指令安装模块:pip install beautifulsoup4
。
以请求百度首页为例。
if __name__ == '__main__':
url = "https://www.baidu.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
print(soup.prettify())
打印输出以下信息:
ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“
...
通过 BeautifulSoup 库可以将请求的网址信息按照标签进行转换展示。下面学习 BeautifulSoup 提供的标签操作方法。
依照上一节中的百度首页为例,下面分别介绍 BeautifulSoup 中常用的方法。
在网页源码中,存在很多类型的标签。通过标签名进行定位只能返回其中的第一个标签。
比如我们查找定位 标签。
if __name__ == '__main__':
url = "https://www.baidu.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
print(soup.input)
输出结果:
标签的属性有:name、class、id 等,我们使用 find 或 find_all 方法查找标签对应的所有属性。
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
url = "https://www.baidu.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# print(soup.prettify())
# 查找 class 属性为 bg s_ipt_wr 的标签
bg_tags = soup.find_all(class_='bg s_ipt_wr')
for tag in bg_tags:
print(tag) # 输出
# 查找 name = rsv_idx
idx = soup.find(attrs={'name': 'rsv_idx'})
print(idx) # 输出
在上面的示例中,我们通过 find_all 方法查找所有 class_= 'bg s_ipt_wr'
的标签。因为 class 这个单词本身是 Python 的保留字,所以 BeautifulSoup 模块中的 class 属性在末尾添加了下划线来进行区分。其他标签属性,如 id 属性,则没有添加下划线。
通过指定标签名 + 属性值可以实现更准确的查找。
if __name__ == '__main__':
url = "https://www.baidu.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# print(soup.prettify())
# 查找 input 标签且属性 name = rsv_idx
idx = soup.find('input', attrs={'name': 'rsv_idx'})
print(idx) # 输出
在上一小节中介绍了 find 方法用于查找标签,使用 select() 函数可以根据指定的选择器返回所有符合条件的标签。常用的选择器有 id 选择器、class 选择器、标签选择器和层级选择器。
根据指定的标签进行筛选。在 find 中根据指定标签名查找时只会返回第一个匹配项。使用 select 标签返回所有。
if __name__ == '__main__':
url = "https://www.baidu.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# print(soup.prettify())
input_tag = soup.select('input')
print(input_tag)
# 输出 [, ]
在 select 中直接查找对应的标签名,会输出所有的标签。
id 选择器是根据 id 值查找对应的标签。格式 ‘#id值’
if __name__ == '__main__':
url = "https://www.baidu.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# print(soup.prettify())
input_tag = soup.select('#kw')
print(input_tag)
# 输出 []
上面的示例中,查找 id 值为 kw 的标签。注意输出是列表形式。
class 选择器根据 class 属性值查找对应的标签,格式为 ‘.class属性值’
if __name__ == '__main__':
url = "https://www.baidu.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# print(soup.prettify())
input_tag = soup.select('.s_ipt')
print(input_tag)
# 输出 []
上面的示例中,查找 class 值为 s_ipt 的标签。注意输出是列表形式。
在 HTML 中标签嵌套很常见,标签在不同的层级形成嵌套结构。通过 标签>标签
这种指向结构来定位。
使用上面的示例数据,我们来验证。
if __name__ == '__main__':
url = "https://www.baidu.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# 查找所有 标签下 标签的 id 属性值为 lg 的标签
div_tag = soup.select('div>div>#lg')
# 输出结果 [ ]
print(div_tag)
# 查找