详细可点击 --> python爬虫教程中转站 欢迎大家的订阅!!!
爬虫定义:网络爬虫(又被称为网页蜘蛛、网络机器人,在FOAF社区中间,更经常的称为网页追逐者),
是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本
另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫
两大特征
三大步骤
爬虫分类
Python网络包简介
'''
案例v01
使用urllib.request请求一个网页内容,并把内容打印出来
'''
from urllib import request
if __name__ == '__main__':
url = "https://www.zhaopin.com/taiyuan/"
# 打开相应url并把相应页面作为返回
rsp = request.urlopen(url)
# 把返回的结果读取出来
# 读取出来内容类型为bytes
html = rsp.read()
print(type(html))
# 如果想把bytes内容转换成字符串,需要解码
print(html.decode())
'''
案例v02
利用request下载页面
自动检测页面编码
'''
import urllib
import chardet
if __name__ == '__main__':
url = "http://stock.eastmoney.com/news/1407,20170807763593890.html"
rsp = urllib.request.urlopen(url)
html = rsp.read()
# 利用chardet自动检测
cs = chardet.detect(html)
print(type(cs))
print(cs)
# 使用get取值保证不会出错
html = html.decode(cs.get("encoding", "utf-8"))
print(html)
# 案例v03
import urllib
import chardet
if __name__ == '__main__':
url = "http://stock.eastmoney.com/news/1407,20170807763593890.html"
rsp = urllib.request.urlopen(url)
print(type(rsp))
print(rsp)
print("URL: {0}".format(rsp.geturl()))
print("Info: {0}".format(rsp.info()))
print("Code: {0}".format(rsp.getcode()))
html = rsp.read()
# 使用get取值保证不会出错
html = html.decode()
# 案例v04
from urllib import request, parse
'''
掌握对url进行参数编码的方法
需要使用parse模块
'''
if __name__ == '__main__':
url = "http://www.baidu.com/s?"
wd = input("Input your keyword: ")
# 要想使用data,需要使用字典结构
qs = {
"wd": wd
}
# 转换url编码
qs = parse.urlencode(qs)
print(qs)
fullurl =url + qs
print(fullurl)
# 如果直接用可读的带参数的url,是不能访问的
# fullurl = "http://www.baidu.com/s?wd=大熊猫"
rsp = request.urlopen(fullurl)
html = rsp.read()
# 使用get取值保证不会出错
html = html.decode()
print(html)
'''
案例v05
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每次敲一个字母后都有请求
3. 请求地址是 https://fanyi.baidu.com/sug
4. 利用 Network-All-Headers 查看,发现FormData的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式内容==>需要用到json包
'''
from urllib import request, parse
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''
baseurl = 'https://fanyi.baidu.com/sug'
# 存放用来模拟form的数据一定是dict格式
data = {
# girl是翻译输入的英文内容,应该是由用户输入,此时使用硬编码
'kw': 'girl'
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode('utf-8')
print(type(data))
# 我们需要构造一个请求头,请求头部应该至少包含传入的数据的长度
# request要求传入的请求头是一个dict格式
headers = {
# 因为使用post请求,至少应该包含content-length 字段
'Content-Length':len(data)
}
# 有了headers,data,url,就可以尝试发出请求了
rsp = request.urlopen(baseurl, data=data)
json_data = rsp.read().decode('utf-8')
print(type(json_data))
print(json_data)
# 把json字符串转化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)
for item in json_data['data']:
print(item['v'], "--", item['v'])
{"errno":0,"data":[{"k":"girl","v":"n. \u5973\u5b69; \u59d1\u5a18; \u5973\u513f; \u5e74\u8f7b\u5973\u5b50; \u5973\u90ce;"},{"k":"girls","v":"n. \u5973\u5b69; \u59d1\u5a18; \u5973\u513f; \u5e74\u8f7b\u5973\u5b50; \u5973\u90ce; girl\u7684\u590d\u6570;"},{"k":"girlfriend","v":"n. \u5973\u670b\u53cb; \u5973\u60c5\u4eba; (\u5973\u5b50\u7684)\u5973\u4f34\uff0c\u5973\u53cb;"},{"k":"girl friend","v":" \u672a\u5a5a\u59bb; \u5973\u6027\u670b\u53cb;"},{"k":"Girls' Generation","v":" \u5c11\u5973\u65f6\u4ee3\uff08\u97e9\u56fdSM\u5a31\u4e50\u6709\u9650\u516c\u53f8\u4e8e2007\u5e74\u63a8\u51fa\u7684\u4e5d\u540d\u5973\u5b50\u5c11\u5973\u7ec4\u5408\uff09;"}]}
{'errno': 0, 'data': [{'k': 'girl', 'v': 'n. 女孩; 姑娘; 女儿; 年轻女子; 女郎;'}, {'k': 'girls', 'v': 'n. 女孩; 姑娘; 女儿; 年轻女子; 女郎; girl的复数;'}, {'k': 'girlfriend', 'v': 'n. 女朋友; 女情人; (女子的)女伴,女友;'}, {'k': 'girl friend', 'v': ' 未婚妻; 女性朋友;'}, {'k': "Girls' Generation", 'v': ' 少女时代(韩国SM娱乐有限公司于2007年推出的九名女子少女组合);'}]}
n. 女孩; 姑娘; 女儿; 年轻女子; 女郎; -- n. 女孩; 姑娘; 女儿; 年轻女子; 女郎;
n. 女孩; 姑娘; 女儿; 年轻女子; 女郎; girl的复数; -- n. 女孩; 姑娘; 女儿; 年轻女子; 女郎; girl的复数;
n. 女朋友; 女情人; (女子的)女伴,女友; -- n. 女朋友; 女情人; (女子的)女伴,女友;
未婚妻; 女性朋友; -- 未婚妻; 女性朋友;
少女时代(韩国SM娱乐有限公司于2007年推出的九名女子少女组合); -- 少女时代(韩国SM娱乐有限公司于2007年推出的九名女子少女组合);
'''
案例v06
任务要求和内容跟v05一样
本案例只是利用Request来实现v05的内容
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每次敲一个字母后都有请求
3. 请求地址是 https://fanyi.baidu.com/sug
4. 利用 Network-All-Headers 查看,发现FormData的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式内容==>需要用到json包
'''
from urllib import request, parse
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''
baseurl = 'https://fanyi.baidu.com/sug'
# 存放用来模拟form的数据一定是dict格式
data = {
# girl是翻译输入的英文内容,应该是由用户输入,此时使用硬编码
'kw': 'girl'
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode('utf-8')
# 我们需要构造一个请求头,请求头部应该至少包含传入的数据的长度
# request要求传入的请求头是一个dict格式
headers = {
# 因为使用post请求,至少应该包含content-length 字段
'Content-Length':len(data)
}
# 构造一个Request的实例
req = request.Request(url=baseurl, data=data, headers=headers)
# 因为已经构造了一个Request的请求实例,则所有的请求信息都可以封装在Request实例中
rsp = request.urlopen(req)
json_data = rsp.read().decode('utf-8')
print(type(json_data))
print(json_data)
# 把json字符串转化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)
for item in json_data['data']:
print(item['v'], "--", item['v'])
{"errno":0,"data":[{"k":"girl","v":"n. \u5973\u5b69; \u59d1\u5a18; \u5973\u513f; \u5e74\u8f7b\u5973\u5b50; \u5973\u90ce;"},{"k":"girls","v":"n. \u5973\u5b69; \u59d1\u5a18; \u5973\u513f; \u5e74\u8f7b\u5973\u5b50; \u5973\u90ce; girl\u7684\u590d\u6570;"},{"k":"girlfriend","v":"n. \u5973\u670b\u53cb; \u5973\u60c5\u4eba; (\u5973\u5b50\u7684)\u5973\u4f34\uff0c\u5973\u53cb;"},{"k":"girl friend","v":" \u672a\u5a5a\u59bb; \u5973\u6027\u670b\u53cb;"},{"k":"Girls' Generation","v":" \u5c11\u5973\u65f6\u4ee3\uff08\u97e9\u56fdSM\u5a31\u4e50\u6709\u9650\u516c\u53f8\u4e8e2007\u5e74\u63a8\u51fa\u7684\u4e5d\u540d\u5973\u5b50\u5c11\u5973\u7ec4\u5408\uff09;"}]}
{'errno': 0, 'data': [{'k': 'girl', 'v': 'n. 女孩; 姑娘; 女儿; 年轻女子; 女郎;'}, {'k': 'girls', 'v': 'n. 女孩; 姑娘; 女儿; 年轻女子; 女郎; girl的复数;'}, {'k': 'girlfriend', 'v': 'n. 女朋友; 女情人; (女子的)女伴,女友;'}, {'k': 'girl friend', 'v': ' 未婚妻; 女性朋友;'}, {'k': "Girls' Generation", 'v': ' 少女时代(韩国SM娱乐有限公司于2007年推出的九名女子少女组合);'}]}
n. 女孩; 姑娘; 女儿; 年轻女子; 女郎; -- n. 女孩; 姑娘; 女儿; 年轻女子; 女郎;
n. 女孩; 姑娘; 女儿; 年轻女子; 女郎; girl的复数; -- n. 女孩; 姑娘; 女儿; 年轻女子; 女郎; girl的复数;
n. 女朋友; 女情人; (女子的)女伴,女友; -- n. 女朋友; 女情人; (女子的)女伴,女友;
未婚妻; 女性朋友; -- 未婚妻; 女性朋友;
少女时代(韩国SM娱乐有限公司于2007年推出的九名女子少女组合); -- 少女时代(韩国SM娱乐有限公司于2007年推出的九名女子少女组合);
Python爬虫之 urllib、UA、代理、Cookie、Session详解