Python爬虫中requests模块的两种请求


requests模块get请求


步骤:
	1.导包
		import requests
	2、确定请求的url
		base_url = ''
	3.发送请求,获取响应。
		response = requests.get(
			url = base_url,#请求的url
			headers={},请求头
			params = {},请求参数字典
		
		)
		
新浪新闻搜索“区块链”爬取页面为例:
import requests
base_url= 'https://search.sina.com.cn/?'
header={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
key='区块链'
params={
    'q': key,
    'c': 'news',
    'from': 'channel',
    'ie': 'utf-8',
}
response=requests.get(base_url,headers=header,params=params)
with open('sina_news.html','w',encoding='gbk') as fp:
    fp.write(response.content.decode('gbk'))
	4.response这个对象包含的内容都有以下几个:
		(1)状态码:
			response.status_code
		 (2)响应头
			response.headers['Cookie']
		 (3)响应正文
			1.获取字符串类型的响应正文
				response.text
			2.获取bytes类型的响应正文
				response.content
			3.响应正文字符串编码
				response.encoding
		 (4)响应内容的乱码问题:
			当我们用response.text获取字符串的响应正文的时候,有时候会出现乱码:
			原因是response.encoding这个字段默认指定编码有误。
			解决办法就是你手动指定
			response.encoding = ‘utf-8’
			
			另一种办法:
				response.content.decode('utf-8')
			
	get请求的项目类别:
		1.没有请求参数的,我们只需要添加请求头,分装
		user-agent这个请求头就可以了。
		2.带请求参数的。比如新浪新闻这个项目
		基础url就是问号以前包括问号的内容。
		设置请求参数字典:
			params = {
				字典的内容就是chrome里面query string params里面的内容
			}
			
			get请求的项目类别:
		1.没有请求参数的,比如百度和百度产品这两个项目,我们只需要添加请求头,分装
		user-agent这个请求头就可以了。
		2.带请求参数的。比如以上新浪新闻那个项目
		基础url就是问号以前包括问号的内容。
		设置请求参数字典:
			params = {
				字典的内容就是chrome里面query string params里面的内容
			}
			
		3.分页---百度贴吧
			方法:
				1.先找出分页的规律。一般是通过params参数中的其中一个参数来控制的。
				2.找到这个参数每一页的规律。
				3.用for循环来请求每一页的内容。

百度贴吧搜索 李毅吧 为例:

import requests
#确定url
base_url='https://fanyi.baidu.com/sug'
#封装headers和data字典
kw='smoke'
data={
    'kw':kw,
}
header={
    'content-length':str(len(data)),
     'content-type':'application/x-www-form-urlencoded; charset=UTF-8',
    'origin':'https://fanyi.baidu.com',
    'referer':'ttps://fanyi.baidu.com/translate?aldtype=16047&query=fd%0D%0A%0D%0A&keyfrom=baidu&smartresult=dict&lang=auto2zh',
    'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
    'x-requested-with':'XMLHttpRequest',
}

response=requests.post(url=base_url,data=data,headers=header)
json_str=response.text
json_data=response.json()
print(json_str)
print(type(json_str))
print(json_data)
print(type(json_data))
result=''
for data in json_data['data']:
    result+=data['v']+'\n'
print(result)

在这里插入图片描述


requests模块的post请求

response = requests.post(
         url,
         headers = {},
         data={},请求数据字典
)
post请求一般得到响应内容是json数据。
处理json数据用到的模块就是json模块。
json数据就是本质上就是字符串。
json.dumps(python的list或者dict)---->(返回值)---->json字符串。
json.loads(json字符串)------>(返回值)----->python的list或者dict.

response.json()---->可以直接将获取到的json字符串转化成python的list或者dict.

爬取有道翻译中的词语:

import requests

base_url='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
kw='python'
data={
    'i': kw,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '15722528677928',
    'sign': '42196062066e84290b1aa9069f249baf',
    'ts': '1572252867792',
    'bv': '6945a57e1923a3517303cdcdb2d3d15e',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}
header={
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Connection': 'keep-alive',
    'Content-Length': '239',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': '_ntes_nnid=d30f47fdab174964bf95db9c3a2c92a7,1563672397970; OUTFOX_SEARCH_USER_ID_NCOO=136178458.51684296; OUTFOX_SEARCH_USER_ID=-1502912526@114.252.227.13; _ga=GA1.2.673474100.1570579170; JSESSIONID=aaaMgH0s0oSPOfivDKr4w; ___rl__test__cookies=1572252867776',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}
response=requests.post(base_url,headers=header,data=data)
print(response.text)

处理post请求的请求参数怎么解决换了请求参数就请求不到的问题?
也就是post请求的内容主要解决请求参数,就可以获取数据了。
思路就是
1、比对。比对data字典,哪些参数是不一样的。
2.想办法找到这些参数的生成原理。
一些参数可以存放:
         1.页面中。–都是固定写死。
         2.js中动态生成参数。
         3.可以通过ajax来获取一些

依旧以爬取有道翻译的词语为例:

import requests
import hashlib,random,time
base_url='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

def get_md5(value):
    md5=hashlib.md5()
    md5.update(value.encode('utf-8'))
    return md5.hexdigest()

kw='word'
salt = str(int(time.time()*1000)) +str(random.randint(0,10))
sign = get_md5("fanyideskweb" +kw+salt+'n%A-rKaT5fb[Gy?;N5@Tj')
ts = str(int(time.time()*1000))
data={
    'i': kw,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': salt,
    'sign': sign,
    'ts': ts,
    'bv': '6945a57e1923a3517303cdcdb2d3d15e',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}

header={
'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Connection': 'keep-alive',
    'Content-Length': '239',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': '_ntes_nnid=d30f47fdab174964bf95db9c3a2c92a7,1563672397970; OUTFOX_SEARCH_USER_ID_NCOO=136178458.51684296; OUTFOX_SEARCH_USER_ID=-1502912526@114.252.227.13; _ga=GA1.2.673474100.1570579170; JSESSIONID=aaaMgH0s0oSPOfivDKr4w; ___rl__test__cookies=1572252867776',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}
response=requests.post(base_url,headers=header,data=data)
print(response.text)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值