requests 模块

爬虫

概念:编写程序模拟浏览器上网,让其去互联网上获取数据的过程

  • 通用爬虫:一整张页面
  • 聚焦爬虫:页面中局部的内容

反爬机制:对应的载体是门户网站

反反爬策略:对应的载体是爬虫程序

robots 协议:“防君子不防小人”

User-Agent:请求载体的身份标识

requests 模块

requests 模块代码编写的流程

  • 指定 URL
  • 发起请求
  • 获取响应对象中的数据
  • 持久化存储
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)

需求:爬取搜狗指定词条搜索后的页面数据

1330952-20190722093531916-183410926.png

需求:爬取百度翻译结果(百度翻译是一个局部的页面刷新,因此发起的是一个基于 ajax 的异步请求)

1330952-20190722093644190-2053425656.png

response.text :返回字符串格式

response.content :返回二进制格式

response.json() :返回 json 格式(要保证返回是 json 数据才能调用该方法)

爬取豆瓣电影分类排行榜(https://movie.douban.com/)中电影的详情数据

豆瓣电影在鼠标滚轮下滑时会自动刷新更多的电影,也是局部页面的 ajax 请求

1330952-20190722093712016-221567890.png

爬取肯德基餐厅查询(http://www.kfc.com.cn/kfccda/index.aspx)中指定地点的餐厅数据

1330952-20190722093726014-315361453.png

爬取国家药品监督管理总局中基于中国化妆品生产许可证相关数据(http://125.35.6.84:81/xk/

每家公司都是一个跳转页面,因此要拿到这些跳转的 a 标签,因为要获取的是点击 a 标签中的详细信息。点击翻页时 URL 并没有变化,因此是 ajax 请求,但是在获取到响应对象的数据时,数据中并没有 a 标签。但是这些数据中有 ID

1330952-20190722093744457-1820891636.png

当点进这些 a 标签进入详情页时,该页的 URL 也并不能获取到详细信息,因此这些详细信息是动态加载出来的,目前所掌握的动态加载只有 ajax,在 Response 中就是该企业的详情信息,发现该 URL 携带的参数是一个 ID,也就是上面所获取的 ID,可以使用循环获取每一个 ID

1330952-20190722093804058-474134788.png

'''
循环产生字典作为请求的参数,使用 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)

图片爬取

1330952-20190722093838910-411862499.png

转载于:https://www.cnblogs.com/qiuxirufeng/p/11224032.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值