第二天–request模块
request模块
- 概念:一个基于网络请求的模块,作用就是模拟浏览器发起请求
- 编码流程:制定URL–>进行请求的发送–>获取响应数据(爬取到的数据)–>持久化存储
爬取搜狗首页对应的页面源码数据
#制定URL
url ='https://www.sogou.com'
#发送请求,返回值是一个响应对象
response=requests.get(url=url)
#获取相应,text返回的是字符串形式的相应数据
page_text=response.text
#保存下来
with io.open('./sogou.html','w',encoding='utf-8')as fp:
fp.write(page_text)
基于搜狗编写一个简易的网页采集器
简单来说就是获取在搜狗引擎中输入关键词的页面
解决的问题:
- 出现乱码问题
- 反爬机制:UA检测
- 反反爬机制
wd=raw_input('enter a key:')
#想要将url携带的参数设定成动态变化的
url='https://www.sogou.com/web'
#用字典存储动态的请求参数
params={
'query':wd
}
#即将发起请求的头信息
headers={
'User-Agent':'放入浏览器的user agent'
}
#一定要把params作用到请求中
#params参数表示的是对请求URL参数的封装
#headers用来实现UA伪装
response=requests.get(url=url,params=params,headers=headers)
#手动修改响应数据的编码
response.encoding='utf-8'
page_text=response.text
fileName=wd+'.html'
#保存下来
with io.open(fileName,'w',encoding='utf-8')as fp:
fp.write(page_text)
print(wd,'下载成功')
爬取豆瓣电影的详情
分析:当滚动滑轮滑动到底部的时候,发起了一个ajax的请求,且该请求到了一组电影数据
动态加载的数据:就是通过另一个额外的请求请求到的数据
–ajax请求
–js生成动态加载的数据
url='https://movie.douban.com/j/new_search_subjects?'
start=input('enter a key')
limit=input('enter a limit')
#处理请求参数
params={
'sort':'T',
'range':'0,10',
'tags':'',
'start':start,
'limit':limit
}
response=requests.get(url=url,params=params,headers=headers)
#json返回的是序列化的对象
data_list=response.json()
fp=open('douban.txt','w',encoding='utf-8')
for dic in data_list:
name = dic['title']
score=dic['score']
fp.write(name+':'+score+'\n')
print(name,'爬取成功')
fp.close()
爬取肯德基位置信息
post_url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city =input('enter a city name')
data={
'cname':'',
'pid':'',
'keyword': '',
'pageIndex': '1',
'pageSize': '10'
}
response=requests.post(url=post_url,data=data,headers=headers)
response.json()
如何判断一张页面是否存在动态加载的信息
针对于网站
- 抓包工具进行局部搜索–在该URL中对应的信息中没有搜到网页中展示的信息,则有动态加载的信息存在
- 如果判定出页面中有动态加载的数据如何进行动态加载定位呢–使用抓包工具进行全局搜索
对一个陌生的网站数据爬取前一定要确定你爬取的数据是否为动态加载的
分析:网站的首页和企业的详情页的数据都是动态加载的
分析某一家企业的详情页数据如何得到的–通过一个ajax请求(post) 请求得到的,该请求携带一个参数id (只有参数id不同)
#请求到每一家企业对应的ID
url=' http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
data={
'on': 'true',
'page': '1',
'pageSize': '15',
'productName':'',
'conditionType': '1',
'applyname':'',
'applysn':''
}
fp=open('./company.txt','w',encoding='utf-8')
#该json()返回值中就有每一家的ID
data_dic=requests.post(url=url,data=data,headers=headers).json()
#解析ID
for dic in data_dic['list']:
_id=dic['ID']
#print(_id)
#对每一个ID对应的企业详情数据进行捕获(发起请求)
post_url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
post_data={
'id':_id
}
#json的返回值是一家企业的详情返回值
detail_dic=requests.post(url=post_url,data=post_data,headers=headers).json()
company_title=detail_dic['epsName']
address=delattr(['epsProductAddress'])
fp.write(company_title+':'+address+'\n')
print(company_title,'爬取成功!!')
fp.close()