python爬虫及urllib库初步使用

1.初识爬虫

网络爬虫(又被称为网页蜘蛛,网络机器⼈,在FOAF社区中间,更经常的称为网页追逐者),是⼀种按照⼀定的规则,⾃动的抓取万维⽹信息的程序或者脚本。

urllib和urllib2库是学习Python爬⾍最基本的库,利⽤这个库我们可以得到⽹⻚的内容,并对内容⽤正则表达式提取分析,得到我们想要的结果。这个在学习过程中我会和⼤家分享的。

2.urllib库初步使用

2.1.简单爬取网页

要爬取网页,我们需要创建请求对象,获取返回的内容和清洗数据这三个步骤。

请求的创建,可以通过urllib库中的request.Request类来实现。例如,

from urllib import request

headers = {
    "User-Agent": "自己的User-Agent",
}  # header头可以在浏览器中“检查”-“网络”中获取

# 创建请求对象
req = urllib.request.Request("http://www.51job.com/", headers=headers)  # 第一个参数为要进行爬取的网址,第二个参数为headers参数

注意,网站为了反爬虫会对访问的浏览器进行验证,我们需要添加headers参数来通过验证。

要获取返回的内容,我们需要通过request.urlopen()方法。例如,

# 获取返回的内容
res = request.urlopen(req)
print(res.info())  # 获取网络信息
print(res.read())  # 获取网页源代码

注意,此时输出的网页源代码为二进制,我们需要使用decode()方法进行转换。例如,

from urllib import request

url = "http://www.so.com"
headers = {
    "User-Agent": "自己的User-Agent",
}

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

res = request.urlopen(req)

print(res.read().decode('utf-8'))  # 将二进制转换为utf-8格式

2.2.下载图片

我们可以通过request.urlretrieve()方法将图片下载到当前文件下。例如,

from urllib import request

request.urlretrieve("https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3830587581,3607655220&fm=26&gp=0.jpg", 'beauty.jpg')  # 第一个参数为图片链接,第二个参数为保存的图片名

2.3.POST请求

我们创建请求对象的时候,如果没有添加data参数,则默认为GET方法请求;如果我们添加data参数,则为POST方法请求。

注意,由于data参数必须是url格式,因此,我们可以通过urllib库中的parse.urlencode()方法将带data参数的字典转换为url格式;同时parse.parse_qs()方法将url格式的字符串转换为字典。例如,

from urllib import parse  # 导入parse

params = {'name': 'YRC', 'age': 18}
result = parse.urlencode(params)  # 将字典转为url
print(result)

reverse = parse.parse_qs(result)  # 将url转为字典
print(reverse)

执行结果如下,

name=YRC&age=18
{'name': ['YRC'], 'age': ['18']}

下面我们展示爬取网易云音乐的其中一页评论,

from urllib import request, parse
import json

url = "https://music.163.com/weapi/v1/resource/comments/A_PL_0_5090312130?csrf_token="

data = {
    'params': '/i59N3sJGoihSvD9S4Ytmaf6Z977fVgwg25dY59FGUQTWhOgsLiWQHv6aYv9rMPngU/5g55GoFQzqoN74QQAvafh3YnK5tDdpKiqDI60IXvW+oO3O1zktOS5iLO6/M94TY0Lmaqryo9OzfRL3+iQ21Yw0ootVy/AhFGJxqX31p7m4AIgxwp05nr4cn0hIwdW',
    'encSecKey': '4be298acedfc2d4b2faa632d37eb597b69934711f75d656794078083865d5a7479d8dd783f485a86d81cadb3790a9a53ca877a72b15f2518051e051649790242ff545e1558012b25e62efd1fba9b6362102230c8bb7b4ebf70359a90d3b408155296c2beea8d6ab61047b67dffb913a3278f956d2f439fd57f33ad7ab86d1a6b',
}

headers = {
        "User-Agent": "自己的User-Agent",
}

data = parse.urlencode(data).encode()

# 创建请求对象
req = request.Request(url, headers=headers, data=data)  # 如果加上data参数就是POST请求

response = request.urlopen(req)

content = response.read().decode('utf-8')  # 返回json数据

# 清洗数据
hotcomments = json.loads(content)

hotcomments_list = hotcomments.get('hotComments')

for hotcomment in hotcomments_list:
    user_id = hotcomment['user']['userId']
    nickname = hotcomment['user']['nickname']
    content = hotcomment['content']
    print(user_id, nickname, content)

注意,上面的url参数和data参数是通过fiddler 4工具获取到的。

你可能感兴趣的:(python爬虫及urllib库初步使用)