目录
1,requests.get()与requests.post()区别
2,爬取豆瓣电影中动作电影的排行
注1:
注2
注3
注4
练习1,获取五页贴吧
练习2,用类与对象尝试
1,requests.get()与requests.post()区别
- requests.get():
response=resquests.get(url=url,headers=headers,params=params)
- requests.post()
response=requests.post(url=url,headers=headers,data=data)
data一般用字典方式传入
2,爬取豆瓣电影中动作电影的排行首先尝试之前的思路:
1,指定url
2,发起请求
3,获取响应数据
- 使用requests.get()方法获取网页上的HTML内容
- 通过lxml库的etree.HTML来解析这个网页结构
- 最后通过xpath来获取自己所需内容
4,持久化存a储
let's go!
from lxml import etree import requests headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Mobile Safari/537.36 Edg/96.0.1054.62"} url = "https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=" r = requests.get(url=url, headers=headers).text tree = etree.HTML(r) leaf = tree.xpath('//div[@]//a/@href') print(leaf)
是空字典。说明了这个数据,是不存在的! 上一篇爬不出美女的原因找到了!!!
这个网站是动态的网站,电影排名是活的。那就要用抓包工具去捕获信息
注1:想要爬取一个网站的一系列图片,xpath要找出他们共同的路径
leaf = tree.xpath('//div[@]/ul/li/a/@href')
注2leaf = tree.xpath('//div[@]//a/@href')
用红框框框起来的地方,就是专门捕获动态响应数据的地方!
找到正确的url 。后面是传递各种参数,直接简化
注3url = 'https://movie.douban.com/j/chart/top_list?'
看响应,哪个包含了我们要的所有信息..第三个
把它给服务器传递的参数单独拿出来看一看
params = {
'type':'5', # 很明显是分类
'interval_id':'100:90', # 还记得开头的好于100%-90%的动作片吗
'action':'',
'start': '0', #从第几个开始
'limit':'20' #每次读取多少个
}
以上内容转载自(71条消息) 一起学爬虫(Python) — 07_小泽-CSDN博客
注4返回的文件是json格式,那我们就需要用json去解析,导入
import json
import requests import json params = { 'type': '5', # 很明显是分类 'interval_id': '100:90', # 还记得开头的好于100%-90%的动作片吗 'action': '', 'start': '0', # 从第几个开始 'limit': '20' # 每次读取多少个 } headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Mobile Safari/537.36 Edg/96.0.1054.62"} url = "https://movie.douban.com/j/chart/top_list?" r = requests.get(url=url, params=params, headers=headers).content.decode() # .content是转成二进制的意思 .decode()是指定编译格式,默认编码为字符串编码 a = json.loads(r) # 用json模块的loads实现把爬下来的数据转换成我们能看懂的数据 print(a)
提取得到数据,遍历a中每一个字典(复习字典用法)
import requests import json params = { 'type': '5', # 很明显是分类 'interval_id': '100:90', # 还记得开头的好于100%-90%的动作片吗 'action': '', 'start': '0', # 从第几个开始 'limit': '20' # 每次读取多少个 } headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Mobile Safari/537.36 Edg/96.0.1054.62"} url = "https://movie.douban.com/j/chart/top_list?" r = requests.get(url=url, params=params, headers=headers).content.decode() # .content是转成二进制的意思 .decode()是指定编译格式,默认编码为字符串编码 a = json.loads(r) # 用json模块的loads实现把爬下来的数据转换成我们能看懂的数据 print(a) # 遍历a列表中的每一个字典 for i in a: pingfen = i['rating'][0] paiming = i['rank'] is_playable = i['is_playable'] fenlei = i['types'] fenleis = '' for a in fenlei: fenleis += a fenleis += ' ' diqu = i['regions'][0] mingzi = i['title'] riqi = i['release_date'] zhuyan = i['actors'] zhuyans = '' for b in zhuyan: zhuyans += b zhuyans += ' ' if is_playable == True: zhuangtai = '可播放' dizhi = i['url'] print('电影名字:'+mingzi) print('排名:', paiming) print('状态::' + zhuangtai) print('链接:' + dizhi) print('评分:' + pingfen) print('主演:' + zhuyans) print('上映日期:' + riqi + '/上映地区:' + diqu + '/分类:' + fenleis) print('-------------------------------------------------------------------') else: zhuangtai = '不可播放' print('电影名字:' + mingzi) print('排名:', paiming) print('状态::' + zhuangtai) print('评分:' + pingfen) print('主演:' + zhuyans) print('上映日期:' + riqi + '/上映地区:' + diqu + '/分类:' + fenleis) print('-------------------------------------------------------------------')练习1,获取五页贴吧
源代码:
import requests headers = { "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Mobile Safari/537.36 Edg/96.0.1054.62"} url = 'https://tieba.baidu.com/f?kw={}&pn={}' text = input('请输入名字:') url_list = [url.format(text, i*50) for i in range(5)] print(url_list) for a in url_list: response = requests.get(url=a, headers=headers).content.decode() file_name = '第{}页贴吧'.format(url_list.index(a)+1)+'.html' with open(file_name, 'w', encoding='utf-8') as f: f.write(response)
出现问题1:列表推导式掌握不扎实
url_list = [url.format(text, i*50) for i in range(5)]
出现问题2:index函数用法->从列表中找出某个值第一个匹配值的索引位置
file_name='第{}页贴吧'.format(url_list.index(a)+1)+'html'
出现问题3:用.content进行手动编码
成功!
练习2,用类与对象尝试(复习类与对象)源代码:
import requests class All(object): def __init__(self, text): self.text = text self.url = 'https://tieba.baidu.com/f?kw={}&pn={}' self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"} def occur_url_list(self): url_list = [self.url.format(self.text, i * 50) for i in range(5)] return url_list def get(self, url): response = requests.get(url=url, headers=self.headers).content.decode() return response def save(self, get_text, num): file_name = '第{}页贴吧~'.format(num)+'.html' with open(file_name, 'w', encoding='utf-8') as f: f.write(get_text) def run(self): url_listt = self.occur_url_list() for a in url_listt: get_text = self.get(a) self.save(get_text, url_listt.index(a)+1) if __name__ == '__main__': text = input('请输入贴吧名字:') a = All(text) c = a.run()
出现问题;
调用类里的函数记得用self
注意传参
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)