案例:
爬虫>>非结构化数据>>2.6案例,黑马代码
多线程:参考千峰代码
盲区:
1.在用fidder抓取会话时,怎么找对应页面的url,另外如果是post请求,data数据在哪里看,以及代码中要添加哪些数据?
拓展了解:
HTTPPasswordMgrWithDefaultRealm()
ProxyBasicAuthHandler(代理授权验证)
2,爬取返回后对象的数据形式以及正则匹配后返回的数据类型
3,编码和字符集的关系,数据类型和对象类型间的关系,编码方式和数据类型间的关系
4,爬取第一层链接后,如何以及为什么要进入第二层链接。在scrapy框架中,spider文件下的多页url中的回调函数运用的逻辑原理
5,crapy框架中的request和response分别是在何时产生和应用的
主要是理解逻辑
1,工具(略)
2,原理:
请求得到
简单请求:
包urllib,
urllib.open(url) >>请求网站 >>返回类文件对象 >>read()读取下来,变成文件 (整个就是一个爬虫)
构造一个request对象目的添加HTTP报头(参数1:url,参数2:headers(伪造浏览器)) >>urllib.open(request) >>请求网站 >>返回类文件对象 >>读取下来,变成文件 (整个就是一个爬虫)
扩展(User-Agent可以随机,建个列表,然后random.choice随机从列表选一个)
get和post传参:
word = {"wd" : "传智播客"} urllib.urlencode(word) # 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受。
print urllib.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2") wd=传智播客 # 通过urllib.unquote()方法,把 URL编码字符串,转换回原先字符串。
有些网页内容使用AJAX加载,只要记得,AJAX一般返回的是JSON,直接对AJAX地址进行post或get,就返回JSON数据了
在访问的时候则会报出SSLError
import ssl context = ssl._create_unverified_context() 一般正常的网站都会主动出示自己的数字证书,来确保客户端和网站服务器之间的通信数据是加密安全的。
2,基本的urlopen()方法不支持代理、cookie等其他的HTTP/HTTPS高级功能
所以可以自定义opener
# 构建一个HTTPHandler 处理器对象,支持处理HTTPS请求 # http_handler = urllib2.HTTPSHandler() opener = urllib2.build_opener(http_handler) response = opener.open(request)
ProxyHandler处理器(*)
# 构建了两个代理Handler,一个有代理IP,一个没有代理IP httpproxy_handler = urllib2.ProxyHandler({"http" : "124.88.67.81:80"}) nullproxy_handler = urllib2.ProxyHandler({}) opener = urllib2.build_opener(nullproxy_handler)
是先创建opener,里面可以加参数,然后用opener.open()函数(里面携带了一些参数)来打开request
代理IP,也可以用列表的形式创建,然后random.choice()来随机选择,并将其加入到opener中,先handler再build_opener(handler)
cookie登录(*)(多看视频,然后与黑马教程做对比)
1,直接登录,取到cookie(黑马说容易被封)
2,利用cookielib包,一次请求保存下来
URLError 产生的原因主要有:
没有网络连接
服务器连接失败
找不到指定的服务器
HTTP Error,错误代号是404,错误原因是Not Found,说明服务器无法找到被请求的页面。
通常产生这种错误的,要么url不对,要么ip被封。
根据返回的错误码对应的去百度(400-599)
包requests
对urllib进行了封装
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers) # 查看响应内容,response.text 返回的是Unicode格式的数据 print response.text # 查看响应内容,response.content返回的字节流数据 # 查看响应内容,response.content返回的字节流数据
response = requests.post("http://www.baidu.com/", data = data) params是get请求,data是post请求
代理参数proxies response = requests.get("http://www.baidu.com", proxies = proxies)
私密代理 import requests # 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式: proxy = { "http": "mr_mao_hacker:sffqry9r@61.158.163.130:16816" } response = requests.get("http://www.baidu.com", proxies = proxy) print response.text
web客户端验证 如果是Web客户端验证,需要添加 auth = (账户名, 密码) import requests auth=('test', '123456') response = requests.get('http: