目录
1,requests.get()与requests.post()区别
2,爬取豆瓣电影中动作电影的排行
注1:
注2
注3
注4
练习1,获取五页贴吧
?练习2,用类与对象尝试
1,requests.get()与requests.post()区别
?response=resquests.get(url=url,headers=headers,params=params)
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[@class="movie-list-panel pictext"]//a/@href')
print(leaf)
是空字典。说明了这个数据,是不存在的! 上一篇爬不出美女的原因找到了!!!
这个网站是动态的网站,电影排名是活的。那就要用抓包工具去捕获信息
注1:
想要爬取一个网站的一系列图片,xpath要找出他们共同的路径
?
leaf = tree.xpath('//div[@class="PictureList"]/ul/li/a/@href')
leaf = tree.xpath('//div[@class="movie-list-panel pictext"]//a/@href')?
注2
用红框框框起来的地方,就是专门捕获动态响应数据的地方!
找到正确的url 。后面是传递各种参数,直接简化
?url = 'https://movie.douban.com/j/chart/top_list?'
注3
看响应,哪个包含了我们要的所有信息..第三个
?把它给服务器传递的参数单独拿出来看一看
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
注意传参
?
|