超详细爬虫入门教学

超详细爬虫入门教学,第1张

超详细爬虫入门教学 1. python网络请求模块

requests模块(主要)urllib模块 2. requests模块

python中原生的一款基于网络请求的模块,功能强大,简单快捷,效率极高作用:模拟浏览器发请求 2.1 环境安装

pip install requestsps:pycharm自带python环境,所以在电脑命令中安转可能在pycharm中导包不了,所以最好在pycharm的终端中进行安转 2.2 如何使用

    指定url向指定url发起请求

    get请求post请求 获取响应对象的数据值持久化存储

入门案例:

import requests
if __name__=='__main__':
    # 指定url
    url='https://www.sogou.com/'
    # 发起请求
    # get方法会返回一个响应对象
    response=requests.get(url=url)
    # 获取响应对象数据
    # 以字符串方式返回页面源码
    page_text=response.text
    print(page_text)
    # 持久化存储
    # 在当前文件夹存储
    with open('./sougou.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
    print('爬取数据结束!!!!')

ps:对于爬取的html数据没有换行,可以在pycharm中全选代码后按ctrl+alt+L快捷键换行 3. 搜狗结果页采集(网页采集器)

# UA检测:
# 门户网站的服务器会检测对应请求的载体身份标识,如果检测的请求的载体身份标识为某一浏览器
# 说明该请求为正常请求。但是,如果请求的载体身份标识不是基于某一款浏览器时,则标识该请求
# 是不正常的(爬虫),则服务器就有可能会拒绝该次请求,所以要进行UA伪装
# UA伪装:让爬虫对应的请求载体身份标识伪装成某一浏览器
# UA:User-Agent
import requests
if __name__=='__main__':
    # UA伪装:将对应的User-Agent封装到一个字典中
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'
    }
    url='https://www.sogou.com/web?'
    # 处理url携带的参数:封装到字典中,一个参数一个键值对
    # 动态设置参数
    kw=input('enter a word:')
    param={
        'query':kw
    }
    # 对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数
    # 第二个参数处理请求参数
    # 第三个参数UA伪装
    response=requests.get(url=url,params=param,headers=headers)
    page_text=response.text
    fileName=kw+'.html'
    with open(fileName,'w',encoding='utf-8') as fp:
        fp.write(page_text)
    print(fileName,'保存成功')
3.1 UA检测与UA伪装

UA检测:UA:User-Agent门户网站的服务器会检测对应请求的载体身份标识,如 果检测的请求的载体身份标识为某一浏览器
说明该请求为正常请求。但是,如果请求的载体身份标识不是基于某一款浏览器时,则标识该请求
是不正常的(爬虫),则服务器就有可能会拒绝该次请求,所以要进行UA伪装UA伪装:让爬虫对应的请求载体身份标识伪装成某一浏览器 3.2 可变参数

在页面参数设置时,可以设置自己输入控制可变参数来爬取自己想要的页面,如上的搜狗搜索结果页面 4. 破解百度翻译

import requests
import json
if __name__=='__main__':
    post_url='https://fanyi.baidu.com/sug'
    head={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'
    }
    # post请求参数处理(同get一样)
    # 这里也能改成动态的参数
    data={
        'kw':'dog'
    }
    # 发送post请求
    response=page_text=requests.post(url=post_url,data=data,headers=head)
    # 服务器返回的是json数据
    # json()方法返回的是obj(如果确认服务器返回的是json类型,才能用)
    dic_obj = response.json()
    fp=open('./dog.json','w',encoding='utf-8')
    # 录入文件
    # 第三个参数为是否能用ASCII码进行编码
    json.dump(dic_obj,fp=fp,ensure_ascii=False)
    print('over!!')

4.1 关于ajax请求与服务器返回类型

ajax请求:即不刷新页面也能进行数据更新,ajax请求返回的就是json类型数据关于服务器返回的类型以及post请求的url可以在浏览器的抓包工具的XHR分类中查看 4.2 关于json格式

可以把抓取到的json语句在json在线解析中解析成标准格式以查看内容 5. 豆瓣电影爬取

跟破解百度翻译差不多

import json
import requests
if __name__=='__main__':
    url='https://movie.douban.com/j/chart/top_list?'
    par={
        'type': '24',
        'interval_id': '100:90',
        'action': '',
        'start': '0',#从库中的第几部电影去取
        'limit': '20' #一次取出的个数
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'
    }
    response=requests.get(url=url,params=par,headers=headers)
    list_data=response.json()
    fp=open('./豆瓣电影.json','w',encoding='utf-8')
    json.dump(list_data,fp=fp,ensure_ascii=False)
    print('over!!!')
6. KFC餐厅查询爬取
import json
import requests
if __name__=='__main__':
    url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?'
    key=input('请输入城市:')
    par={
        'op':'keyword',
        'cname':'',
        'pid':'',
        'keyword': key,
        'pageIndex': '1',
        'pageSize': '100'
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'
    }
    response=requests.post(url=url,params=par,headers=headers)
    page_text=response.text

    # 将字符串转换为json类型
    page_json=json.loads(page_text)
    fp=open('./kfc.json','w',encoding='utf-8')
    json.dump(page_json,fp=fp,ensure_ascii=False)
    print('over!!!')

ps: 如果抓取的数据类型不是json类型,也可以用json.loads()方法把抓取的字符串转换为json数据类型 6.1 关于多页数据的爬取

我们爬取页面时有时候会遇到多页面,想全部爬取数据怎么办呢?如果是ajax请求页面一般会有类似于pageIndex和pageSize的参数,这个时候我们可以把pageSize参数的数据设置大一点就可以爬取所有页面的数据了,也可以在爬取的json文件动态获取总数据数进行爬取,或者用循环遍历所有的pageIndex获取 7. 综合练习-药监总局

import json
import requests
if __name__=='__main__':
    url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
    data={
        'on': 'true',
        'page': '1',
        'pageSize': '',
        'productName':'',
        'conditionType': '1',
        'applyname':'',
        'applysn':''
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'
    }
    json_ids=requests.post(url=url,headers=headers,data=data).json()
    id_list=[]#存储所有的企业id
    all_data_list=[]#存储所有的企业详情数据
    # 获取所有的ID
    for dic in json_ids['list']:
        id_list.append(dic['ID'])
    post_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    for id in id_list:
        data={
            'id':id
        }
        detail_json=requests.post(url=post_url,headers=headers,data=data).json()
        all_data_list.append(detail_json)
    fp=open('./药监总局.json','w',encoding='utf-8')
    json.dump(all_data_list,fp=fp,ensure_ascii=False)
    print('over!!!!')
7.1 关于发送请求中data与params区别

data:是添加到请求体中的,用于post请求params:是添加到url的请求字符串中的,用于get请求 8. requests库的text方法、content方法、json类型的区别

text方法:返回字符串content方法:返回二进制json方法:返回对象 9. 关于post请求与get请求区别

post请求:

post请求没有编码集的限制post参数在REQUSET BODY中,用户不可见,相对安全参数长度无限制post请求会先把请求头发送到服务器进确认,然后才真正发送数据post请求不会对数据进行缓存post请求一般用于修改和写入数据 get请求:

get请求只能用ASCLL码get请求参数在url中,用户可见浏览器会对url长度进行限制,所以get请求参数长度一般也会被限制,不同浏览器限制长度不一样get请求会把请求头与数据一起发送get请求会把数据进行缓存get请求一般用于搜索排序和筛选之类的 *** 作

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5711032.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存