概念:编写程序模拟浏览器上网,让其去互联网上获取数据的过程html
反爬机制:对应的载体是门户网站python
反反爬策略:对应的载体是爬虫程序ajax
robots 协议:“防君子不防小人”json
User-Agent:请求载体的身份标识浏览器
requests 模块代码编写的流程服务器
import requests # 指定URL url = 'https://www.sogou.com/' # 发起请求 response = requests.get(url=url) # 获取响应对象中的数据 page_text = response.text # response.text是字符串 # 持久化存储 with open('./sougou.html', 'w', encoding='utf-8') as fp: fp.write(page_text)
需求:爬取搜狗指定词条搜索后的页面数据app
需求:爬取百度翻译结果(百度翻译是一个局部的页面刷新,所以发起的是一个基于 ajax 的异步请求)异步
response.text :返回字符串格式post
response.content :返回二进制格式网站
response.json() :返回 json 格式(要保证返回是 json 数据才能调用该方法)
爬取豆瓣电影分类排行榜(https://movie.douban.com/)中电影的详情数据
豆瓣电影在鼠标滚轮下滑时会自动刷新更多的电影,也是局部页面的 ajax 请求
爬取肯德基餐厅查询(http://www.kfc.com.cn/kfccda/index.aspx)中指定地点的餐厅数据
爬取国家药品监督管理总局中基于中国化妆品生产许可证相关数据(http://125.35.6.84:81/xk/)
每家公司都是一个跳转页面,所以要拿到这些跳转的 a 标签,由于要获取的是点击 a 标签中的详细信息。点击翻页时 URL 并无变化,所以是 ajax 请求,可是在获取到响应对象的数据时,数据中并无 a 标签。可是这些数据中有 ID
当点进这些 a 标签进入详情页时,该页的 URL 也并不能获取到详细信息,所以这些详细信息是动态加载出来的,目前所掌握的动态加载只有 ajax,在 Response 中就是该企业的详情信息,发现该 URL 携带的参数是一个 ID,也就是上面所获取的 ID,能够使用循环获取每个 ID
''' 循环产生字典做为请求的参数,使用 requests 发的是 post 请求 会用到第三个参数 headers,这个参数涉及到 User-Agent,它是请求载体的身份标识 也就是说使用浏览器发请求和使用 requests 发请求,对应的请求载体不一样,即身份标识不一样 大部分的网站都会检测对应请求的身份标识,正经常使用户访问都会经过浏览器发起请求 这里使用的是爬虫程序,它发的载体就不是基于某一款浏览器 若是使用 requests 发请求,服务器端是能够检测对应请求的身份标识,可能就拿不到想要的数据 反爬机制:UA(User-Agent)检测 ----> UA 假装 能够对当前使用 requests 发的请求载体进行假装成基于某一浏览器的 这里的 headers 就是请求头信息 '''
import requests url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" } id_list = [] for page in range(1, 11): data = { "on": "true", "page": str(page), "pageSize": "15", "productName": "", "conditionType": "1", "applyname": "", "applysn": "", } json_data = requests.post(url=url, data=data, headers=headers).json() for dic in json_data['list']: id = dic['ID'] id_list.append(id) detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' for id in id_list: detail_data = { "id": id } detail_json = requests.post(url=detail_url, data=detail_data, headers=headers).json() print(detail_json)