1.PythonDemo
import requestsr = requests.get("http://img4.duitang.com/uploads/item/201602/22/20160222170529_jLBSY.jpeg")f=open("hecore.png","wb")
二进制写入本地
f.write(r.content)f.close()print("状态码:"+str(r.status_code))
字典类型
print(r.request.headers)
结果:
状态码:200{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '/', 'User-Agent': 'python-requests/2.18.4'}
2.拟浏览器访问
指定header
指定User-Agent的值
headers={"User-Agent": "'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
使用headers
headers={"User-Agent": "'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}url="http://img4.duitang.com/uploads/item/201602/22/20160222170529_jLBSY.jpeg"r = requests.get(url,headers=headers)
print(r.request.headers)
请求说明
哪些地方用到POST请求:
登录注册(POST比GET更安全)
需要传输大文本内容的时候(POST请求对数据长度没有要求)
所以同样的,爬虫需要在对应的需求处采用POST请求。
3.分析思路
1.表单提交
查找接口-->查询变化参数名Formdata部分。
2.Python写法
xx.py 参数1 参数2 ..
3.Post请求格式
response =requests.post(url,data=data,headers=headers)
data格式:字典
4.Cookie和Session
(2)爬虫处理
带上cookie,session好处
能够处理请求登录之后的页面
带上cookie,session的坏处
cookie和session一一对应,请求过快,系统认为是爬虫。
不需要使用cookie的时候尽量不去使用cookie
但为了获取登录之后的数据信息,我们必须使用cookie
(3).requests处理
提供了一个session的类,来实现客户端和服务端的会话保持
使用方法:
1.实例化一个session对象
2.让session发送get或者post请求
session = requests.session()
response=session.get(url,headers)
session.post(post_url,data=post_data,headers=headers)
实战,session访问人人网
3.Cookie过期问题
过期时间短和长的问题。
用法
headers={
"User-Agent":"...."
键值对形式
"Cookie":"anonymid=j33231;r01=1"
}
r=requests.get(url,headers=headers)
4.requests小技巧
(1).设置超时
response = requests.get(url,timeout=10)
(2).assert response.status_code=200
assert做断言(假设)
二、豆瓣电视剧爬虫
1.基础代码
import requests
headers={"User-Agent": "'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
def _parse_url(url): print(""100) #可能会超时报错 r = requests.get(url,headers=headers,timeout=5) #可能请求不成功 assert r.status_code == 200 return r.content.decode()
def parse_url(url): try: html=_parse_url(url) except Exception as e: print("报错",e) html=None return html
if name == 'main': url="http://www.baidu.com" html = parse_url(url) if html is None: print("false") else: print("true") print(html)
注意Python中没有{},所以对缩进要求很严格
2.数据提取
(1).简单来说,数据提取就是从响应中获取我们需要的数据
(2).数据分类
非结构化的数据:html
处理方法:
Python:xpath
Java:Dom,Sax解析
结构化数据:json等
处理方法:
Ptyhon:转为python数据类型
Java:fastJson,等。
JavaScript:json.parse(str)
(3).核心:找到返回json的数据的url
1.抓包查看网络请求
2.把浏览器网页切换到手机版
不是每个响应都是Json
-->程序员填充数据方式
(1).json接口
(2).asp,jsp,php动态渲染
(3).freemarker等引擎静态渲染
(4).静态网页
3.分析url地址到底是什么类型的。
特别说明jsonp跨域访问-->去掉jsonp是原接口。
3.数据持久化
基础代码
from parse import parse_urlimport jsonimport requests
headers={"User-Agent": "'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
def get_url_list(): url_list=[ { "type":"english", "url_temp":"https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_english_hot/items?os=ios&for_mobile=1&start={}&count=18" }, { "type":"korean", "url_temp":"https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_korean_drama_hot/items?os=ios&for_mobile=1&start={}&count=18" }, { "type":"animation", "url_temp":"https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_animation_hot/items?os=ios&for_mobile=1&start={}&count=18" } ] return url_list
def get_content_list(json_response): dict_response = json.loads(json_response) total_num = dict_response["total"] content_list = dict_response["subject_collection_items"] return content_list,total_num
def save_content_list(content_list): for content in content_list: print(content) print(""100) def _parse_url(url): print(""100) #可能会超时报错 r = requests.get(url,headers=headers,timeout=5) #可能请求不成功 assert r.status_code == 200 return r.content.decode()
def parse_url(url): try: html=_parse_url(url) except Exception as e: print("报错",e) html=None return html
def run(): #1.url_list,请求列表 url_list_temp=get_url_list();
#获取总数,终止 #total_num = dict_response["total"] for url_temp in url_list_temp: num = 0 total_num = 100 #初始化变量 while num <= total_num+18: url=url_temp["url_temp"].format(str(num)) #2.发送请求,获取响应 json_response=parse_url(url) #3.提取数据 content_list,total_num=get_content_list(json_response); #4.保存 for content in content_list: content["type"]=temp["type"] save_content_list(content_list) num += 18
if name == 'main': run()