Fork me on GitHub

Python_Spider

[TOC]

1.爬取网页

response属性

读取数据

1.读取文件的全部内容,会把读取到的数据赋值给一个列表
data = response.readlines()
2.读取文件的全部内容,会把读取到的数据赋值给一个字符串
data = response.read()

  1. 读取文件的一行
    data = response.readline()
    4.encode 将我们看得懂得东西变为看不懂得东西
    _ decode 将我们看不懂得东西变为看得懂得东西

    返回当前环境的有关信息

    data = response.info()

返回状态码

data = response.getcode()
if response.getcode() ==200 or response.getcode() ==304

返回正在爬取的URL地址

data = response.geturl()

编码(解码),将url中的汉字编码转化为汉字

url="http://***"
newurl = urllib.request.(un)quote(url)

有时候内容编码是Unicode的格式,则需要对其进行编码再解码
content.encode('latin-1').decode('unicode_escape')

改进
decode(“utf-8”,”ignore”)

2.将网页存取到指定文件中

import urllib.request
urllib.request.urlretrieve("url",filename=r"存取的文件地址")

注意:urlretrieve在执行的过程中会产生一些缓存,清除缓存如下操作
urllib.request.urlcleanup()

3.模拟浏览器

利用User-Agent,添加headers,使得模拟更加真实

1
2
3
4
5
6
7
8
9
10
11
import urllib.request
url = " "
headers = {
"User-Agent":" "
}
#设置一个请求体,构建请求对象
req = urllib.request.Request(url,headers=headers)
#发起请求
response = urllib.request.urlopen(req)
data = response.read().decode("utf-8")
print (data)

1
2
3
4
5
6
7
8
9
10
11
#保持模拟浏览器登陆状态--cookies
#post请求一般应用在登陆
#为保证持续模拟登陆,则需要处理好cookies
req_attr = urllib.request.Request(url=url,data=encode_data,headers=headers)
response_attr = urllib.request.urlopen(req_attr)
#read().decode("gbk")
#print (response)
#获取登陆后获取的响应头,处理相应的cookies以保持登陆状态
print(response_attr.headers)

#比较两个cookies的不同,将浏览器响应头修改为服务器登陆响应头
1
2
3
4
5
6
7
8
9
10
11
12
# 为防止被封IP可以将多个Agent做成列表,多次变换
agentlist = [
"",
"",
""
]
agentstr = random.choice(agentlist)
req =urllib.request.Request(url)
#向请求体里添加了User-Agent
req.add_header("User-Agent",agentstr)
response =urllib.request.urlopen(req)
print (response.read().decode("utf-8"))

- 请求url的错误处理,防止无法请求url而影响程序

1
2
3
4
5
6
7
8
import requests.exceptions import RequestException
def page_state(rep):
try:
if rep.status_code == 200: # 如果状态码正常,则返回url的内容
return rep.text
return None
except:
return None

4.设置超时&间隙时间

1
2
3
4
5
6
7
8
9
10
#在使用urllib或者urllib2时,有可能会等半天资源都下载不下来,
#可以通过设置socket的超时时间,来控制下载内容时的等待时间。

#如下python代码

import socket

timeout = 20
socket.setdefaulttimeout(timeout)
#这样默认20秒之后就会超时。
1
2
3
4
5
6
7
8
9
10
11
12
import urllib.request
import time
time.sleep(10)

#如果网页长时间未反应,系统判断超时
for i in range(1,100): #循环次数
try:
response = urllib.request.urlopen(
"http://www.baidu.com",timeout = 0.5)
print (len(response.read().decode("utf-8")))
except:
print ("请求超时,继续下一个爬取")

5.HTTP请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'''
使用场景:进行客户端与服务器之间的消息传递时使用
Get :通过URL网址传递信息,可以直接在URL地址上传递信息
Post :可以向浏览器提交数据,时一种比较流行的比较安全的数据传递。
如密码等,但速度慢
Put :请求服务器存储一个资源,通常要指定存储的位置
Delete :请求服务器删除一个资源
Head :请求获取对应的HTTP报头信息
Options :可以获取当前URL所支持的请求类型
'''

#对于一些既有post请求,又有get请求的网页
#get请求的参数在url地址中
#post请求的参数需要我们单独传递数据,对数据进行编码
import urllib.parse
#创建请求体的参数内容
headers = {}
post_data = {}
#利用urllib.parse对post_data进行处理
#data参数如果要传必须传bytes(字节流)类型的
#如果是一个字典,先用urllib.parse.urlencode()编码。
encode_data = urllib.parse.urlencode(post_data).encode("utf-8")
req = urllib.request.Request(url=url,data=encode_data,headers=headers)

Https请求

1
2
3
#抓取HTTPS协议
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

6.抓取网页动态Ajax请求的数据

1
2
3
4
5
6
7
8
import ssl
#抓取https协议的网页
req = urllib.request.Request(url,headers=headers)
#使用ssl创建未验证的上下文
context = ssl._create_unverified_context()
response = urllib.request.urlopen(req.context=context)
jsonstr = response.read().decode("utf-8")
jsondata = json.loads(jsonstr)
1
2
# 动态数据,在 js文件中有真正的请求url
# 爬取静态与动态网页通法
  • 1.建立需求
    • 源代码中没有我们需要的数据
      原因:
      • 1.Ajax异步加载 :通过多个请求获取数据
        (通过XHR筛选出Ajax加载的数据)
        • 2.数据加密

7.保存文件,数据持久化

1
2
3
4
5
6
7
8
9
import requests
url = " "
headers = {
"User-Agent":" "
}
response = requests.get(url,headers=headers)
with open("demo.zip","wb") as f:
#以二进制形式打开文件
f = write(url.content)
1
2
3
4
import os
# 导入os模块,为爬取的文件新建文件夹,可进行分类保存

os.mkdir("文件夹名称")
喜欢的可以对我打赏了哟~