爬虫练习

说是练习,实际是尝试了一些还没有具体了解的方式吧hhhhh'

基于urllib实现

import urllib.request
import re url="https://www.zhihu.com/question/21100397" # 我们要爬取图片的地址 page = urllib.request.urlopen(url) # 第一行 打开网址
html = page.read().decode("utf-8") # 第二行 获取html源码 imglist = re.findall('img src="(http.*?)"',html) # 第三行 在html中匹配出符合条件的字符串 x=0
for imgurl in imglist: # 遍历图片地址列表
urllib.request.urlretrieve(imgurl,'pic%s.jpg' %x) # 第四行 获取图片并保存
x=x+1

定义函数的三种方式

# 无参函数
# 不需要接收外部传入的参数
def foo():
print('from foo..')
foo()
# # 有参函数
# 需要接收外部传入的参数
def login(user, pwd):
print(user, pwd) # 传参多一或少一不可
#login('tank', '123')
# login('tank', '123', 111) # 多,报错
# login('tank') # 少,报错 # # x = 10
# # y = 20
# # if x > y:
# # print(x)
# # else:
# # print(y)
# 比较两数大小
def max2(x, y):
if x > y:
print(x)
else:
print(y) max2(10, 30) # 空函数
# 遇到一些比较难实现的功能,会导致暂时无法继续编写代码。
# 所以一般在生产开发中,都会将所有功能实现定义成空函数。
def func():
pass # pass代表什么都不做

函数的返回值
在调用函数时,需要接收函数体内部产生的结果,则return返回值。

def max2(x, y):

if x > y:

return x

else:

return y

res = max2(10, 5)

print(res)

函数对象
指的是函数名指向的内存地址。

 def func():
pass
# print(func) # <function func at 0x101dd2e18>
#
# func()
def func2():
pass
# 把函数对象,传入字典中
dict1 = {
'': func,
'': func2
}
choice = input('请输入功能编号:').strip()
# if choice == '1':
# func()
# elif choice == '2':
# func2()
#
# 若用户选择函数对象对应的key值,则调用该函数
if choice in dict1:
dict1[choice]() # dict1['1']

函数嵌套:
  嵌套定义:
    在函数内,定义函数。

嵌套调用:

def func1():
print('func1...')
def func2():
print('func2...')
def func3():
print('func3...')
# ....
return func3
return func2
# 通过函数内部的函数值,调用函数
func2 = func1()
func3 = func2()
func3()
# 函数嵌套调用
def func1():
print('func1...')
def func2():
print('func2...')
def func3():
print('func3...')
# ....
func3()
func2()
func1()

名称空间
python解释器自带的: 内置名称空间
自定义的py文件内,顶着最左边定义的: 全局名称空间
函数内部定义的: 局部名称空间

name = 'tank'

def func1():
# name = 'abc'
print() def func2(): print('func2...') # print(name, '全局打印') func1()

引用自己编辑的包以及文件

import B

# from
# 导入B模块中的a文件
# 会自动执行a文件中的代码
from B import a # __name__: B.a
# a

常用模块(内置模块)


time 时间模块

import time  # 导入time模块
# 获取时间戳
print(time.time())
# 等待2秒
time.sleep(2)
print(time.time())

os 模块

# 与操作系统中的文件进行交互
# 判断tank.txt文件是否存在
print(os.path.exists('test.txt')) # True
print(os.path.exists('test1.txt')) # False
print(os.path.exists(r'C::\Users\liubin\Desktop\test.txt')) # True
# 获取当前文件的根目录
print(os.path.dirname(__file__)) # D:/python_files/day03

sys模块

import sys
# 获取python在环境变量中的文件路径
print(sys.path)
# 把项目的根目录添加到环境变量中
sys.path.append(os.path.dirname(__file__))
print(sys.path)

json模块

import json
# user_info = {
# 'name': 'tank',
# 'pwd': '123'
# } # dumps: 序列化
# 1、把字典转行成json数据
# 2、再把json数据转换成字符串
res = json.dumps(user_info)
print(res)
print(type(res))
with open('user.json', 'wt', encoding='utf-8') as f:
f.write(res) # loads: 反序列化
# json.loads()
# 1、把json文件的数据读到内存中
with open('user.json', 'r', encoding='utf-8') as f:
# # 读取得到的是字符串
res = f.read()
# # print(type(res))
# # loads把json格式的字符串转换成dict类型
user_dict = json.loads(res)
print(user_dict) # {'name': 'tank', 'pwd': '123'}
print(type(user_dict)) # <class 'dict'> # dump
user_info = {
'name': 'tank',
'pwd': ''
}
with open('user_info.json', 'w', encoding='utf-8') as f:
# str1 = json.dumps(user_info)
# f.write(str1)
# dump: 自动触发f.write方法
json.dump(user_info, f) # load
with open('user_info.json', 'r', encoding='utf-8') as f:
# res = f.read()
# user_dict = json.loads(res)
# print(user_dict) # load:自动触发f.read()
user_dict = json.load(f)
print(user_dict)

http协议:
请求url:
https://www.baidu.com/

请求方式:
GET

请求头:
  Cookie: 可能需要关注。
  User-Agent: 用来证明你是浏览器
    注意: 去浏览器的request headers中查找
  Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)       Chrome/65.0.3325.146 Safari/537.36
  Host: www.baidu.com

requests模块使用

 import requests

response = requests.get(url='https://www.baidu.com/')
response.encoding = 'utf-8'
print(response) # <Response [200]>
# # 返回响应状态码
print(response.status_code) #
# 返回响应文本
# print(response.text)
print(type(response.text)) # <class 'str'>
with open('baidu.html', 'w', encoding='utf-8') as f:
f.write(response.text)

爬取梨视频

import requests
res = requests.get('视频地址')
print(res.content)
with open('视频.mp4', 'wb') as f:
f.write(res.content)

Python Learning Day3的更多相关文章

  1. python笔记 - day3

    python笔记 - day3 参考:http://www.cnblogs.com/wupeiqi/articles/5453708.html set特性: 1.无序 2.不重复 3.可嵌套 函数: ...

  2. python s12 day3

    python s12 day3   深浅拷贝 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  3. python learning Exception & Debug.py

    ''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...

  4. Python Learning Paths

    Python Learning Paths Python Expert Python in Action Syntax Python objects Scalar types Operators St ...

  5. Python Learning

    这是自己之前整理的学习Python的资料,分享出来,希望能给别人一点帮助. Learning Plan Python是什么?- 对Python有基本的认识 版本区别 下载 安装 IDE 文件构造 Py ...

  6. python基础 Day3

    python Day3 1.作业回顾 设定一个理想的数字比如88,让用户输入数字,如果比88大,则显示猜测的结果大:如果比66小,则显示猜测的结果小了,给用户三次猜测机会,如果显示猜测正确退出循环,如 ...

  7. Python学习day3作业

    days3作业 作业需求 HAproxy配置文件操作 根据用户输入,输出对应的backend下的server信息 可添加backend 和sever信息 可修改backend 和sever信息 可删除 ...

  8. python基础:day3作业

    修改haproxy配置文件 基本功能:1.获取记录2.添加记录3.删除记录 代码结构:三个函数一个主函数 知识点:1.python简单数据结构的使用:列表.字典等 2.python两个模块的使用:os ...

  9. How to begin Python learning?

    如何开始Python语言学习? 1. 先了解它,Wiki百科:http://zh.wikipedia.org/zh-cn/Python 2. Python, Ruby等语言来自开源社区,社区的学法是V ...

随机推荐

  1. 如何拯救被Due逼疯的留学生们?

    Final季又到了,还有多少paper,多少project没完成?每年一到这个时候,手忙脚乱赶各种进度就成了留学小伙伴们共同的日常.任务多,不知道从何开始,拖延,烦躁……到底该怎么办?小编今天为各位介 ...

  2. SDRAM调试总结

    SDRAM的调试总结 1 说明 实验平台: JZ2440 CPU: S3C2440 SDRAM型号: EM63A165TS-6G   2 SDRAM的一些基本概念 2.1 引脚分配   2.2 引脚描 ...

  3. Web服务器:Apache的安装使用

    Apache我们很熟悉,已经用了不短时间的tomcat就是apache公司开发的,那么这款以公司命名的所谓的Web服务器Apache,又到底什么呢? 一.概念 Apache是一个静态的Web服务器,是 ...

  4. 1 —— js 语法回顾 —— 数据类型。流程控制。数组

    一,数据类型 字符串 . 数值 .布尔. null . undefined . 对象  ( 数组 . 函数 function(){} . object) undefined 出现的情景 :  (1)变 ...

  5. C++实现单链表的12种基本操作

    C++单链表的操作2017-12-25 1 // 单链表.cpp: 定义控制台应用程序的入口点. //Author:kgvito //Date: 2017.12.25 #include "s ...

  6. [洛谷Luogu]P1141 01迷宫[联通块 并查集]

    题目链接 大致题意 相邻格子不同为连通,计算每个点所在的连通块大小. 想法 我采用了并查集的做法. 开一个辅助数组记录连通块大小,每次合并的时候更新父亲节点的大小即可. 一个点先与它上面的点判定,若判 ...

  7. Android Studio SharedPreferences

    Android 中最简单的数据存储方式 : SharedPreferences SharedPreferences 数据存储处理实际上时对一个个key——value 数据对的处理 使用SharedPr ...

  8. 096-PHP循环使用next取数组元素

    <?php function return_item($arr,$num=0){ //定义函数 for($i=0;$i<$num;$i++){ //循环向前移动数组指针 next($arr ...

  9. StackExchange.Redis.DLL 操作redis加强版

    直接引用StackExchange.Redis.dll这一个dll来操作redis App.config配置 <?xml version="1.0" encoding=&qu ...

  10. Spark SQL 笔记

    Spark SQL 简介 SparkSQL 的前身是 Shark, SparkSQL 产生的根本原因是其完全脱离了 Hive 的限制.(Shark 底层依赖于 Hive 的解析器, 查询优化器) Sp ...