步骤:
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)
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; [email protected]; _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; [email protected]; _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)