网络爬虫(又被称为网页蜘蛛,网络机器⼈,在FOAF社区中间,更经常的称为网页追逐者),是⼀种按照⼀定的规则,⾃动的抓取万维⽹信息的程序或者脚本。
urllib和urllib2库是学习Python爬⾍最基本的库,利⽤这个库我们可以得到⽹⻚的内容,并对内容⽤正则表达式提取分析,得到我们想要的结果。这个在学习过程中我会和⼤家分享的。
要爬取网页,我们需要创建请求对象,获取返回的内容和清洗数据这三个步骤。
请求的创建,可以通过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格式
我们可以通过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') # 第一个参数为图片链接,第二个参数为保存的图片名
我们创建请求对象的时候,如果没有添加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工具获取到的。