0%

python模块

一、math数学模块

math.ceil() 向上取整

math.floor() 向下取整

math.pow() 计算一个数值的N次方 -> 结果为浮点数 且 只有两个参数无第三个参数(对比内置函数pow())

math.sqrt() 开平方运算 -> 结果为浮点数

math.fabs() 就算一个数的绝对值 -> 结果为浮点数 (对比内置函数abs() -> 结果为整数)

math.modf() 将浮点数拆分成小数部分和整数部分 -> 以元组形式返回(小数部分,整数部分)

math.copysign() 将第二个参数的正负号拷贝给第一个(返回一个浮点数) 注意:不管第一个参数正负 eg:math.copysign(-12,-1) -> -12.0

math.fsum() 求一个容器中的数据进行求和运算 -> 结果为浮点数 (对比内置函数sum() -> 结果为整数)

阅读全文 »

python内置函数

abs() 绝对值函数

round() 四舍五入 => 奇进偶不进 n.5的情况会发生 eg: 3.5 => 4 2.5 => 2

sum() 计算一个序列之和 => 元组 列表 集合

max() 求出一个序列的最大值

min() 求出一个序列最小值

sorted(iterator,key) 排序函数

pow(x,y) 求x的y次方

pow(x,y,z) 求x的y次方对z取余

range() 左闭右开 一个参数: 0-n; 两个参数: x-y 三个参数:x-y,隔z间隔

阅读全文 »

爬虫基础

一、君子协议

image-20220106150517345

服务器渲染:在服务器那边直接把数据和HTML整合在一起,统一返回给浏览器

客户端渲染:第一次请求只拿到和HTML的骨架,第二次请求拿到数据,进行结合,在页面源代码中,看不到数据,拿到数据需要进行抓包

二、数据解析

  1. re解析 正则表达式 快
  2. bs4解析 简单 效率低
  3. xpath解析 流行的解析方式

正则表达式

语法:使用元字符进行排列

image-20220108104224319

image-20220108110035577

eg:爬取电影天堂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# -*- coding:utf-8 -*-
# @Time :2022/4/22 10:28
# @SOFTWARE :爬虫学习

import re
import requests
import csv

domain = "https://www.dytt89.com/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44"
}
resp = requests.get(domain,headers = headers,verify = False) # 若出现安全验证,直接添加 Verify = False 跳过即可
resp.encoding = "gb2312"
result1 = resp.text
resp.close()
# print(resp.text)
obj1 = re.compile(r"2022新片精品(?P<ul>.*?)</ul>",re.S)
obj2 = re.compile(r"<li><a href='(?P<href>.*?)' title=",re.S)
obj3 = re.compile(r'片  名(?P<movie>.*?)<br />.*?<tr>.*?<a href="(?P<dlocation>.*?)">',re.S)
result2 = obj1.finditer(result1)
f = open("data2.csv",mode = "w")
csvwriter =csv.writer(f)
child_href_list = []
for it in result2:
ul = it.group("ul")
result3 = obj2.finditer(ul)
for itt in result3:
child_href = domain + itt.group("href").strip("/")
child_href_list.append(child_href)
# print(child_href)
# print(itt.group("href"))
# print(itt.group("movie"))
for href_ in child_href_list:
resp2 = requests.get(href_,headers = headers,verify = False)
resp2.encoding = "gb2312"
child_page = resp2.text
resp2.close()
resutl4 = obj3.search(child_page)
# print(resutl4.group("movie"))
# print(resutl4.group("dlocation"))
dic = resutl4.groupdict()
csvwriter.writerow(dic.values())
f.close()
print("over!")



bs4

思路:以爬取优美图库为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# -*- coding:utf-8 -*-
# @Time :2022/1/8 18:16
# @SOFTWARE :爬虫学习


import requests
from bs4 import BeautifulSoup
import time

#解析数据
#1. 把页面源代码交给BeautifulSoup进行处理,生成bs对象
#2.从bs对象中查找数据
## find(标签,属性 = 值) 一个
## find_all(标签,属性 = 值) 一堆
# class_="" 加下划线课可避免与关键字重复
#或者 attrs = { "class":""}

#1.拿到主页面的源代码,然后提取到子页面的链接地址,href
#2.通过href拿到子页面的内容,从子页面中找到图片的下载地址 img->src
#3.下载图片

url = "https://www.umei.cc/bizhitupian/weimeibizhi/"
resp = requests.get(url)
resp.encoding = "utf-8" #解码

# 把源代码交给bs

main_page = BeautifulSoup(resp.text,"html.parser")
alist = main_page.find("div",class_="TypeList").find_all("a") #把范围第一次缩小
for a in alist:
href_first = (a.get("href"))
href = "https://www.umei.cc" + href_first
#拿到子页面源代码
child_page_resp = requests.get(href)
child_page_resp.encoding = "utf-8"
child_page_text=child_page_resp.text
child_page = BeautifulSoup(child_page_text,"html.parser")
p = child_page.find('p',align = "center")
img = p.find("img")
src = img.get("src")
img_resp = requests.get(src)
img_name = src.split("/")[-1]
with open("img/"+img_name,mode="wb") as f:
f.write(img_resp.content)

print("over!",img_name)
time.sleep(1)
print("all over!!!")




Xpath

在XML文档中搜索内容的一门语言

注意:不能匹配tbody标签 可以//越过tbody

html是xml的一个子集

image-20220809194038940

image-20220809203104892

eg:爬取猪八戒网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding:utf-8 -*-
# @Time :2022/1/10 9:41
# @SOFTWARE :爬虫学习
import requests
from lxml import etree

url = "https://taiyuan.zbj.com/search/f/?kw=SAAS"
resp = requests.get(url)
# resp.encoding = "utf-8"

html = etree.HTML(resp.text)

divs = html.xpath("/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div")
for div in divs:
price = div.xpath("./div/div/a/div[2]/div[1]/span[1]/text()")
amount = div.xpath("./div/div/a/div[2]/div[1]/span[2]/text()")
name = div.xpath("./div/div/a/div[2]/div[2]/p/text()")
location =div.xpath("./div/div/a[1]/div[1]/div/span/text()")
print(location)

三、多线程

线程:执行单位

进程:资源单位,每一个进程至少有一个线程

启动一个程序,默认有一个主线程

多线程创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 第一种:简单,直白
from threading import Thread # 线程类
t = Thread(target = 函数, args = ("xxx",)) # 创建线程,并给线程交代任务,若函数需要传参,arg的值必须为 元组
t.start() # 开始执行该线程 -> 多线程状态为可以开始状态,具体执行由CPU决定
t2 = Thread(target = 对象(函数))
t2.start()

# 第二种:正规
class MyThread(Thread): # 继承类
def __init__:
# 对于传参 定义init类
def run(self): # 固定格式 -> 当线程被启动之后,被执行的就是run() 即下方的t.start()执行之后
for i in range(1000):
print("子线程",i)
if __name__ = "__main__":
t = MyThread()
t.start()


多进程创建

1
2
3
4
5
6
7
8
9
10
from multiprocessing import Process
def func():
for i in range(1000):
print("func",i)

if __name__ == '__main__':
p = Process(target=func)
p.start()
for i in range(1000):
print("main",i)

线程池:一次性开辟一些线程,用户直接给线程池提交任务,线程任务的调度交给线程池来完成

1
2
from concurrent.futures import ThreadPoolExecutor(线程池类),ProcessPoolExecutor(进程池类)

四、常用数据解析方法

image-20220809191021835

  1. re解析 正则表达式

思路:使用元字符进行匹配

阅读全文 »

nginx部署ssl证书

1.下载SSL证书

阅读全文 »

344.反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

阅读全文 »

283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

阅读全文 »

704.二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

阅读全文 »

977.有序数组的平方和

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

阅读全文 »