爬虫学习参考博客:https://www.cnblogs.com/cyycyhcbw/articles/10442399.html
1.使用软件anaconda
2.输入jupyter notbook
3.anaconda使用快捷键
-插入cell: a 上一行插入 b 下一行插入
-删除: x
-模式切换: m切换到master y 切换到code
-执行cell:shift+enter
-tab
-打开帮助文档:shift+tab
4.爬虫概述
通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程
5.爬虫的分类:
5.1通用爬虫:爬取一整张页面源码数据
5.2聚焦爬虫:爬取页面中指定的局部数据
5.3增量式爬虫:检测网站数据更新的情况,爬取的就是网站中最新的数据
6.反爬机制
7.反反爬策略
8.第一个反爬机制:robots.txt协议
二:requests模块的应用
-requests:功能强大,操作简单
-urllib
-作用:用来模拟浏览器发请求
-编码流程
-指定url
-发起请求:requests.get/post
-获取响应数据
-持久化存储
#爬取搜狗首页的源码数据 import requests #1. url="https://www.sogou.com/" #2. response=requestes.get(url=url) #3. page_text=response.text #4. with open('/sougou.html','w',encoding='utf-8') as fp: fp.write(page_text)
#简易的网页采集器 wd=input('enter a word') #1. url="https://www.sogou.com/web?" #2.将请求参数设定为动态的 param={ "query":wd } #3.params传参 response=requests.get(url=url,params=param) #4.手动设置响应数据的编码,处理中文乱码问题 response.encoding='utf-8' #5.text返回的是字符串形式的响应数据 page_text=response.text filename=wd+'.html' with open(filename,'w',enconding='utf-8') as fp: fp.write(page_text)
#打开页面会出现以下错误,这是网站的反爬机制
#用户您好,我们的系统检测到您网络中存在异常访问请求。
#此验证码用于确认这些请求是您的正常行为而不是自动程序发出的,需要您协助验证。
User-Agent:请求载体的身份标识
UA检测:门户网站的服务器端会检测每一个请求的UA,如果检测到请求的UA为爬虫程序,则请求失败
UA伪装:
#简易的网页采集器 wd=input('enter a word') #1. url="https://www.sogou.com/web?" #2.将请求参数设定为动态的 param={ "query":wd } #UA伪装 headers={ "User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' } #3.params传参 response=requests.get(url=url,params=param,headers=headers) #4.手动设置响应数据的编码,处理中文乱码问题 response.encoding='utf-8' #5.text返回的是字符串形式的响应数据 page_text=response.text filename=wd+'.html' with open(filename,'w',encoding='utf-8') as fp: fp.write(page_text)
#爬取肯德基餐厅位置信息(有关于ajax刷新页面的数据采集) url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' #动态生成城市 city=input('enter a city name:') data={ 'cname': '', 'pid': '', 'keyword': city, 'pageIndex': '1', 'pageSize': '10', } headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' } response=requests.post(url=url,data=data,headers=headers) page_text=response.json() print(page_text) #这里文件操作可以覆盖写入,也可以追加写入 fp=open('/kfc.text','w',encoding='utf-8') for dic in page_text['Table1']: addr=dic['addressDetail'] print(addr) fp.write(addr+'\n') fp.clouse()
- 爬取动态加载的页面数据
#爬取豆瓣电影的电影详情数据 url='https://movie.douban.com/j/chart/top_list' s =1 limit=100 param={ 'type': '5' 'interval_id': '100:90' 'action':'' 'start': s 'limit': limit } response=requests.get(url=url,headers=headers,params=param) page_text=response.json()
爬取药监局相关的数据http://125.35.6.84:81/xk/
- 发现首页中的所有的企业数据都是动态加载出来的
- 通过抓包工具捕获动态加载数据对应的数据包
- 从上一步的数据包对应的响应数据中提取到企业的相关信息(ID)
- 通过分析每一家企业详情页面的url发现,所有的详情页的url域名都是一样的,只有id不同
- 可以通过获取每一家企业的id结合着固定的域名拼接成详情页的url
- 对url发起请求就可以获取企业详情数据
#爬取药监局相关的数据http://125.35.6.84:81/xk/ url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' data = { "on": "true", "pageSize": "15", "productName": "", "conditionType": "1", "applyname": "", "applysn": "", } page_text = requests.post(url=url,headers=headers,data=data).json() for dic in page_text['list']: _id = dic['ID']
#拿到ID后发现详情页面也是动态加载的,所以上面的步骤要重新来一遍,就可以拿到详情页面的数据了,注意请求方式为post detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' data = { 'id':_id } detail_data = requests.post(url=detail_url,headers=headers,data=data).json() print(detail_data)
爬取图片
- content返回的是二进制byte形式的响应数据
- 两种方法:1是用requests,2是用urllib
#如何爬取图片 url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560235823355&di=4f6c6ad96539247edda08e7ad09f0dee&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F-fo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2Fadaf2edda3cc7cd9e3670adb3901213fb80e916d.jpg' #content返回的是二进制bytes形式的响应数据 img_data = requests.get(url=url,headers=headers).content with open('./123.jpg','wb') as fp: fp.write(img_data)
from urllib import request url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560235823355&di=4f6c6ad96539247edda08e7ad09f0dee&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F-fo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2Fadaf2edda3cc7cd9e3670adb3901213fb80e916d.jpg' request.urlretrieve(url=url,filename='./456.jpg')
http协议:client和server进行数据交互的形式
https协议:http加密后
参考https://www.cnblogs.com/bobo-zhang/p/9645715.html
------------------------------------------------------------------------------------------------------------------------------------
回顾总结:
爬虫的分类:
通用爬虫:爬取一整个页面
聚焦爬虫:爬取页面的某一部分
增量式爬虫:对新增内容的爬取
requests的使用
作用:模拟浏览器发请求
get/post:参数url params/data,headers
反爬机制:
robots:不需要做任何事情,直接可以爬取
UA检测:UA伪装 User-Agent
编码流程:
指定url
发起请求
获取响应数据
持久化存储
get/post返回值:响应对象response
text:字符串形式的响应数据
json():返回的是标准的json数据,也就是字典
content:二进制形式的响应数据
encoding:响应数据的编码
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:爬虫第一天 - Python技术站