爬虫笔记

1
2
3
4
5
6
7
1、通过一个程序,根据url进行爬取网页,获取有用的信息
2、使用程序模拟浏览器,去向服务器发送请求,获取响应信息

爬虫的核心
1、爬取网页:爬取整个网页,包含网页中所有的内容
2、解析数据:将网页中你得到的信息进行解析
3、难点:爬虫与反爬虫的博弈

urllib库的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
urllib.request.urlopen()      模拟浏览器向服务器发送请求
response 服务器返回的数据
response的数据类型是HttpResponse
字节-->字符串
解码decode
字符串-->字节
编码encode
read() 字节形式读取二进制,扩展read(5)返回前几个字节
readline() 读取一行
readlines() 一行一行的读取,直至结束
getcode() 获取状态码
geturl() 获取url
getheaders() 获取headers
urllib.request.urlretrieve()
请求网页
请求图片
请求视频

基本使用

1
2
3
4
5
6
7
8
9
import urllib.requset

url = 'http://www.baidu.com'

response = urllib.request.urlopen(url)

content = response.read().decode('utf-8')

print(content)

一个类型和六个方法

1
2
3
4
5
6
7
8
9
一个类型
HttpResponse
六个方法
read() 字节形式读取二进制,扩展read(5)返回前几个字节
readline() 读取一行
readlines() 一行一行的读取,直至结束
getcode() 获取状态码
geturl() 获取url
getheaders() 获取headers

下载

1
2
3
4
5
6
7
8
9
10
11
12
13
import urllib.request

# 下载网页
url_page = 'http://www.baidu.com'
urllib.request.urlretrieve(url_page, 'baidu.html')

# 下载图片
url_image = '图片链接'
urllib.request.urlretrieve(url_image, 'tupian.jpg')

# 下载视频
url_vedio = '视频地址'
urllib.request.urlretrieve(url_vedio, 'shipin.mp4')

url的组成

协议 主机/域名 端口号 路径 参数 锚点
http/https www.baidu.com 80/443

端口号:

http: 80

https: 443

mysql: 3306

请求对象的定制

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
import urllib.request

url = 'https://www.baidu.com'

response = urllib.request.urlopen(url)

content = response.read().decode('utf-8')

print(content)

遇到了`ua`反爬

import urllib.request

url = 'https://www.baidu.com'

headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57'
}
# 请求对象的定制,参数要对应
request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

print(content)

unicode编码

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
1、导入需要使用的库
import urllib.parse

2、使用相应的方法
name = urllib.parse.quote('周杰伦')

3、拼接url
url = 'https://www.baidu.com/s?wd='
url = url + name

4、正常使用即可
import urllib.request
import urllib.parse

headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57'
}

name = urllib.parse.quote('周杰伦')
url = 'https://www.baidu.com/s?wd='
url = url + name

# 请求对象的定制,参数要对应
request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

print(content)

get请求的urlencode方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
urlencode应用场景:多个参数的时候

1、导库
import urllib.parse
2、定义字典
data = {
'wd': '周杰伦',
'sex': '男',
'location': '中国台湾省'
}
3、使用urlencode方法
a = urllib.parse.urlencode(data)

print(a)
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
# 完整的代码

import urllib.request
import urllib.parse

base_url = 'https://www.baidu.com/s?'

data = {
'wd': '周杰伦',
'sex': '男',
'location': '中国台湾省'
}

new_data = urllib.parse.urlencode(data)

url = base_url + new_data

headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57'
}

request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

print(content)