Python爬虫从0到1(二)

一、项目练习

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.数据持久化

https://m.douban.com/tv/

https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_english_hot/items?os=ios&for_mobile=1&start=0&count=18&loc_id=108288&_=0

基础代码

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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值