http中的一些基本名词
requestheader — 请求头里面
response — 返回数据
Accept — 文本格式
Accept-Encoding— 编码格式
Connection— 长链接 短连接
Cookie— 验证用的
Host— 域名
Referer— 标志从哪个页面跳转过来的
User-Agent— 浏览器和用户的信息
爬虫的基本原理
- 确认你抓取目标的url是哪一个(找)
- 使用python代码发送请求获取数据(java、Go)
- 解析获取到的数据(精确数据)–找到新的目标(url)回到第一步(自动化)
- 数据持久化
- request(第三方)
- 数据解析:xpath bs4
- 数据存储
爬取百度源码
import urllib.request
def load_data():
url = "http://www.baidu.com/"
#get的请求
#http请求
#response:http相应的对象
response = urllib.request.urlopen(url)
print(response) #<http.client.HTTPResponse object at 0x000002046E55AF08>
#读取内容 bytes类型
data = response.read()
print(data)#打印出了整个网页的源码(无格式)
#将文件获取的内容转换成字符串
str_data = data.decode("utf-8")
print(str_data) #打印出了整个网页的源码(有格式)
#将数据写入文件
with open("baidu.html","w",encoding="utf-8")as f:
f.write(str_data)
#将字符串类型转换成bytes
# str_name = "baidu"
# bytes_name =str_name.encode("utf-8")
# print(bytes_name)
#python爬取的类型:str bytes
#如果爬取回来的是bytes类型:但是你写入的时候需要字符串 decode("utf-8")
#如果爬取过来的是str类型:但你要写入的是bytes类型 encode(""utf-8")
load_data()
爬取包含汉字的网页
import urllib.request
import urllib.parse
import string
def get_method_params():
url = "http://www.baidu.com/s?wd="
#拼接字符串(汉字)
#python可以接受的数据
#https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3
name = "美女"
final_url = url+name
print(final_url)
#代码发送了请求
#网址里面包含了汉字;ascii是没有汉字的;url转译
#将包含汉字的网址进行转译
encode_new_url = urllib.parse.quote(final_url,safe=string.printable)
print(encode_new_url)
# 使用代码发送网络请求
response = urllib.request.urlopen(encode_new_url)
print(response)
#读取内容
data = response.read().decode()
print(data)
#保存到本地
with open("02-encode.html","w",encoding="utf-8")as f:
f.write(data)
#UnicodeEncodeError: 'ascii' codec can't encode
# characters in position 10-11: ordinal not in range(128)
#python:是解释性语言;解析器只支持 ascii 0 - 127
#不支持中文
get_method_params()
爬取字典参数的网页
import urllib.request
import urllib.parse
import string
def get_params():
url = "http://www.baidu.com/s?"
params = {
"wd":"中文",
"key":"zhang",
"value":"san"
}
#将字典中的冒号变为等号
str_params = urllib.parse.urlencode(params)
print(str_params)
#wd=%E5%A4%A7%E6%95%B0%E6%8D%AE&key=zhang&value=san
final_url = url+str_params
#将带有中文的url 转译成计算机可以识别的url
end_url = urllib.parse.quote(final_url,safe=string.printable)
response = urllib.request.urlopen(end_url)
data = response.read().decode("utf-8")
print(data)
# 将数据写入文件
with open('zhangsan.html', 'w', encoding='utf-8')as f:
f.write(data)
get_params()
知识点总结
python爬取的类型:str和bytes
如果爬取回来的是bytes类型:但是你写入的时候需要字符串 decode(“utf-8”)
#将bytes类型转换成字符串
byte_name = b"baidu"
print(byte_name)#b'baidu'
bytes_name =byte_name.decode("utf-8")
print(bytes_name)#baidu
如果爬取过来的是str类型:但你要写入的是bytes类型 encode("“utf-8”)
#将字符串类型转换成bytes
str_name = "baidu"
bytes_name =str_name.encode("utf-8")
print(bytes_name)
将数据写入文件
with open("baidu.html","w",encoding="utf-8")as f:
#baidu.html是要写入的文件名,自动创建
f.write(data)
将包含汉字的网址进行转译
#网站拼接(以下两个包必须有)
import urllib.parse
#import urllib 这样写也不可以
import string
url = "http://www.baidu.com/s?wd="
name = "美女"
final_url = url+name
print(final_url)#http://www.baidu.com/s?wd=美女
#网址里面包含了汉字;ascii是没有汉字的;url转译
#python:是解释性语言;解析器只支持 ascii 0 - 127
#不支持中文
#将包含汉字的网址进行转译
encode_new_url = urllib.parse.quote(final_url,safe=string.printable)
print(encode_new_url) # http://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3
将冒号变为等号
import urllib.request
import urllib.parse
import string
url = "http://www.baidu.com/s?"
params = {
"wd":"中文",
"key":"zhang",
"value":"san"
}
# 将字典中的冒号变为等号
str_params = urllib.parse.urlencode(params)
print(str_params) #wd=%E5%A4%A7%E6%95%B0%E6%8D%AE&key=zhang&value=san
final_url = url+str_params
#将带有中文的url 转译成计算机可以识别的url
end_url = urllib.parse.quote(final_url,safe=string.printable)
print(end_url)