不忘初心,
牢记使命。

Python爬虫---requests模块的基本使用

2021-04-01 大聪明 20评论 591 0喜欢

Python爬虫---requests模块的基本使用

基础

  • 什么是爬虫?

    就是通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程。

  • 爬虫的分类

    • 通用爬虫
      • 抓取互联网中的一整张页面数据
    • 聚焦爬虫
      • 抓取页面中的局部数据
    • 增量式爬虫
      • 用来检测网站数据更新的情况,以便爬取到网站最新更新出来的数据
  • 反爬机制

    • robots协议

      文本协议,防君子不防小人。

  • 反反爬策略

  • 爬虫合法吗?

    • 风险体现:

      • 干扰了被访问网站的正常运行
      • 抓取了收到法律保护的特定类型的数据或信息
    • 规避风险

      • 严格遵守网站设置的robots协议:查看时在域名后加robots.txt, https://www.taobao.com/robots.txt

      • 优化自己的代码,不要干扰网站的运行。

requests模块的基本使用

  • 什么是requests模块?

    python中封装好的基于网络请求的模块。

  • requests模块的作用?

    用来模拟浏览器发请求

  • requests模块的环境安装

    pip insatll requests

  • requests模块的编码流程:

    1. 指定url
    2. 发起请求
    3. 获取响应数据
    4. 持久化存储

简单爬取搜狗搜索网页

# 爬取搜狗首页源码数据
import requests
# 1.指定url
url = 'https://www.sogou.com'
# 2.请求发送get,返回值是一个响应对象
response = requests.get(url=url)
# 3.获取响应数据
page_text = response.text  # 返回的是字符串形式的响应数据
# 4.持久化存储
with open('sogou.html', 'w', encoding='utf-8') as fp:
    fp.write(page_text)
# 实现一个简易的网页采集器
import requests
# 需要让url携带的菜蔬动态化
url = 'https://www.sogou.com/web'
# 实现参数动态化
wd = input('enter a key:')
params = {
    'query': wd
}
# 在请求中需要将请求参数对应的字典作用到params这个get方法的参数中
response = requests.get(url=url, params=params)

page_text = response.text

file_name= wd + '.html'
with open(file_name, 'w', encoding='utf-8') as fp:
    fp.write(page_text)
# 上述代码执行后:乱码,量级不对

# 实现一个简易的网页采集器
# 解决乱码
import requests
# 需要让url携带的菜蔬动态化
url = 'https://www.sogou.com/web'
# 实现参数动态化
wd = input('enter a key:')
params = {
    'query': wd
}
# 在请求中需要将请求参数对应的字典作用到params这个get方法的参数中
response = requests.get(url=url, params=params)
response.encoding = 'utf-8'  # 修改编码格式

page_text = response.text

file_name= wd + '.html'
with open(file_name, 'w', encoding='utf-8') as fp:
    fp.write(page_text)
# 用户您好,我们的系统检测到您网络中存在异常访问请求。

UA检测:门户网站通过检测请求载体的身份标识判定该请求是否为爬虫发起的请求。

UA伪装:

import requests

url = 'https://www.sogou.com/web'

wd = input('enter a key:')
params = {
    'query': wd
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
# 在请求中需要将请求参数对应的字典作用到params这个get方法的参数中,伪装headers
response = requests.get(url=url, params=params, headers=headers)
response.encoding = 'utf-8'  # 修改编码格式

page_text = response.text

file_name= wd + '.html'
with open(file_name, 'w', encoding='utf-8') as fp:
    fp.write(page_text)

爬取豆瓣电影的详细数据

"""
爬取豆瓣电影的详细数据:https://movie.douban.com/tag/#/?sort=U&range=0,10&tags=%E5%8A%A8%E4%BD%9C
分析:当滚动条被滑动到页面底部的时候,点击加载更多,页面没有刷新,但是数据增加了。所以,当前页面发生了局部刷新,也就是发起了Ajax请求。
动态加载的页面数据:
    是通过另一个单独的请求请求到的数据
"""
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
# 发起的Ajax请求url,我们尝试拿到响应数据
# https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=60&genres=%E5%8A%A8%E4%BD%9C
url = 'https://movie.douban.com/j/new_search_subjects'

# 参数动态化
# 没办法,机制每次就能返回20个,请求参数中无limit
dic = {
    'sort': 'U',
    'range': '0,10',
    'tags': '',
    'start': '0',
    'genres': '动作',
}

response = requests.get(url=url, headers=headers, params=dic)

page_text = response.json()  # 发现.text拿到的是json数据,所以直接json序列化
# print(page_text)
print(len(page_text['data']))
for dic in page_text['data']:
    print(dic['title'])  # 本次Ajax请求拿到的所有电影的名字

20
信条
这个杀手不太冷
釜山行
头号玩家
阿凡达
让子弹飞
毒液:致命守护者
超能陆战队
功夫
红海行动
唐人街探案2
蝙蝠侠:黑暗骑士
唐人街探案
复仇者联盟4:终局之战
复仇者联盟2:奥创纪元
战狼2
海王
指环王1:魔戒再现
无双
钢铁侠

爬取kfc餐厅地址

"""
kfc餐厅地址查询:http://www.kfc.com.cn/kfccda/storelist/index.aspx
"""
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}

url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"

# 它是post请求
for page in range(1, 5):
    dic = {
        'cname': '',
        'pid': '',
        'keyword': '南京',
        'pageIndex': str(page),
        'pageSize': '10',
    }

    response = requests.post(url=url, data=dic)
    page_text = response.json()
    # print(page_text)
    for dic in page_text['Table1']:
        print(dic['storeName']+':'+dic['addressDetail'])






张家港塘桥:张家港塘桥镇南京路与西环路交汇处大润发卖场1层
苏站精选:苏站路27号苏州站2F层候车室2A检票口(高铁动车南京方向)
南京路:南京路99号一层肯德基
三阳:南京东路626-636号一层和二层
南京西路:南京西路277号
海光寺:南京路与南门外大街交口
乐宾:南京路滨江道口乐宾百货一层
南五:南京南街78号南五大润发一楼
南京商厦:龙蟠路2号
南京车站:曙光大酒店旁 龙蟠路111号(站外)
    。。。。

爬取药监总局相关企业的详细信息

"""
爬取药监总局相关企业的详细信息:http://scxk.nmpa.gov.cn:81/xk/
如何检测页面中是否存在动态加载的数据
    使用抓包工具 F12 点到network ctrl+f打开全局搜索,搜索页面的内容看他在哪个请求中
    其实还就i是Ajax  直接点XHR就能看到
"""
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}

url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'

# 在Header中看到它也是个post请求
# 想看那一页 就改对应的page
dic = {
    'on': 'true',
    'page': '1',
    'pageSize': '15',
    'productName':'',
    'conditionType': '1',
    'applyname':'',
}

response = requests.post(url=url, data=dic, headers=headers)

page_text = response.json()
# print(page_text)
for dic in page_text['list']:
    url_ = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    data = {
        'id': dic['ID'],
    }
    resp = requests.post(url=url_, data=data, headers=headers)
    text = resp.json()
    print(text['epsName'], text['legalPerson'])

福建省梦娇兰日用化学品有限公司 卢碧莲
昆明锐斯得科技有限公司 向沛林
重庆小丸生物科技股份有限公司 袁彦洁
广州中科佰氏健康产业有限公司 侯炎
广州瑞美堂生物科技有限公司 吴锐聪
广东优品生物科技有限公司 杨继粮
广州欧特丽美容生物科技有限公司 付军良
广州鑫蕊生物科技有限公司 周俊杰
广州全亚化妆品国际实业有限公司 何甜莉
广州市锦致精细化工有限公司 胡建军
广州德谷个人护理用品有限公司 胡振海
广州隆翔化妆品有限公司 吕丽霞
广州市卓多姿化妆品有限公司 朱嘉诺
广州颜尚化妆品有限公司 陈光德
曼秀雷敦(中国)药业有限公司 冼启聪

大量访问会封你的IP,使用代理IP:https://goubanjia.com 提高免费的代理IP

  1. wrrqsvnhn
    2021-07-23 07:09:12

    嗯嗯 不错

    回复
  2. ogzphkdzs
    2021-06-17 04:38:42

    嗯呢

    回复

发表评论 取消回复

电子邮件地址不会被公开。

请输入正确格式的qq邮箱
请输入以http或https开头的URL,格式如:https://libo_sober.top