python爬虫


爬虫简介

爬虫在使用场景中的分类

  • 通用爬虫
    • 抓取系统重要组成部分
    • 抓取的是一整张页面数据
  • 聚焦爬虫
    • 聚焦在通用爬虫的基础之上
    • 抓取的是页面中特定的局部内容
  • 增量式爬虫
    • 检测网站中数据更新的情况
    • 只会抓取网站中最新更新的数据

      爬虫是合法还是违法的

  •    在法律中不被禁止
  •  具有违法风险
    • 爬虫的风险
      •    干扰了被访问网站的正常运营
      •    爬虫抓取了受到法律保护的特定类型的数据和信息
    • 善意爬虫 恶意爬虫

      爬虫是什么

  •    通过编写程序 模拟浏览器上网 然后让其取互联网抓取数据的过程
  • robots.txt协议

requests模块

  • 明确规定了那些数据可以被爬虫爬取,哪些不可以被爬取 君子协议
    • python中原生的一款基于网络请求的模块 功能非常强大 简单快捷 效率极高
    • 作用:模拟浏览器发请求
  • 如何使用
    • 1.指定url
    • 2.发起请求
    • 3.获取响应数据
    • 4.持久化存储

      数据解析

  • 数据解析分类
    • 正则
    • bs4
      • 1.实例化一个beautifulsoup对象,并且将页面源码数据加载到该对象中
      • 2.通过调用beautifulsoup对象中相关的属性或者方法进行标签定位和数据取
    • xpath
      • 最常用最便捷最高效的一种解析方式 通用性也强
        • 解析原理
          • 1.实例化一个etree的对象 且需要将被解析的页面源码数据加载到改数据当中
          • 2.调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的捕获
        • 环境安装:-pip install lxml
        • 如何实例化一个etree对象
          • 1.将本地的html文档对象中的源码数据加载到etree对象中
              etree.parse(filepath)
          • 2.可以将从互联网上获取的源码数据加载到改对象中
              etree.HTML('page_text')
        • xpath(‘xpath表达式’)
          • /:表示的是从根节点开始,表示的是一个层级
          • //:表示的是多个层级。可以从任意位置开始定位
          • 属性定位://tag[@class=‘class名’]
          • 索引定位://tag[@class=‘class名’]/tag2[x] 索引是从1开始的
          • 取文本:/text()[0](因为返回的是一个列表 所以加上[0])
          • 取属性:/@属性值
  • 数据解析原理
    • 解析的局部的文本内容都会在标签之间或标签对应的属性中进行存储
    • 1.进行标签定位
    • 2.标签或者标签对应的属性中存储的数据值进行提取(解析)
  • 编码流程
    • 1.指定url
    • 2.发起请求
    • 3.获取响应数据
    • 4.数据解析
    • 5.持久化存储

验证码

  • 验证码识别
    • 反爬机制:验证码 识别验证码图片中的数据,用于模拟登录操作
    • 识别验证码
      • 1.人工肉眼识别
      • 2.第三方自动识别
          云打码
          超级鹰

request高级

  • 代理
      破解封ip这种反爬机制
    • 什么是代理
        代理服务器
    • 代理的作用
        突破自身ip的限制
        隐藏自身真实ip
    • 代理相关网站
        块代理
        西祠代理
        西祠代理
        www。goubanjia。com
    • 代理ip类型
        http
        https

异步爬虫

-之后的内容正在学习中

简单爬虫实例

  • 以下几个例子是通过学习爬虫并通过python写出的简单练习,均为新手练习 在此记录一下:

肯德基餐厅信息查询

  • 可以通过输入要检索的城市名称来进行指定信息扒取
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import requests

    url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    city=input("请输入要爬取的城市名称")
    index=input("q请输入要爬取的页码")
    keyword={
    'cname':'' ,
    'pid':'' ,
    'keyword': city,
    'pageIndex':index,
    'pageSize':'10',
    }
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    response=requests.post(url=url,data=keyword,headers=headers)
    response_text=response.text
    print(response_text)
    filename=city+'肯德基餐厅信息.text'
    fp=open(filename,'a',encoding='utf-8')
    fp.write('\n')
    fp.write(response_text)
    print("爬取成功")

    搜狗浏览器搜索页面的扒取

  • 扒取到的是一整张搜索页面
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import requests

    url='https://www.sogou.com/web'
    kw=input("请输入要爬取的内容:")
    uag={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    quar={
    'query':kw
    }
    respon=requests.get(url=url,params=quar,headers=uag)
    filename=kw+'.html'
    respon_text=respon.text
    with open(filename,'w',encoding='utf-8') as fp:
    fp.write(respon_text)
    print(filename ,"保存成功")

    豆瓣电影排行榜数据扒取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import requests
    import json

    url='https://movie.douban.com/j/chart/top_list'
    list={
    'type': '24',
    'interval_id':'100:90',
    'action':'',
    'start': '0',
    'limit': '200',
    }
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    response=requests.get(url=url,params=list,headers=headers)
    name_list=response.json()
    fp=open('豆瓣电影排行榜.json','w',encoding='utf-8')
    json.dump(name_list,fp=fp,ensure_ascii=False)
    print("爬取完成")

    百度搜索结果扒取

  • 可以自主输入要扒取的内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import requests
    import json
    #获取url
    post_url='https://fanyi.baidu.com/sug'

    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    search=input("请输入你要搜索的对象:")
    name={
    'kw':search
    }

    sponse=requests.post(url=post_url,data=name,headers=headers)
    dictobj=sponse.json()
    print(dictobj)


    filename='搜索结果.json'
    fp=open(filename,"a",encoding='utf-8')
    fp.write('\n')
    json.dump(dictobj,fp=fp,ensure_ascii=False)

    print("搜索完毕,结果已输出")

    对糗事图片网站图片的批量扒取

  • 纯粹的批量扒取图片下载
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import requests
    import re
    import os
    if not os.path.exists('./img_list'):
    os.mkdir('./img_list')
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    for j in range(1,3):

    url='http://xiaohua.zol.com.cn/qutu/diaosi/%d.html'
    new_url=format(url%j)
    respons=requests.get(url=new_url,headers=headers).text
    ex='<div class="summary-text">.*?<img ?l?o?a?dsrc="(.*?)" alt.*?</div>'
    img_list=re.findall(ex,respons,re.S)
    print(img_list)
    for src in img_list:
    imgdata= requests.get(url=src,headers=headers).content
    img_name=src.split('/')[-1]
    img_path= './img_list/'+img_name
    fp=open(img_path,'wb')
    fp.write(imgdata)

    国家药品监督管理总局中居于中华人民共和国化妆品生产许可证相关数据

  • 纯粹练习之作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import requests
    import json
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    url ='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
    for l in range(1,6):
    page=str(l)
    data={
    'on': 'true',
    'page': page,
    'pageSize': '15',
    'productName': '',
    'conditionType': '1',
    'applyname':'' ,
    'applysn': '',
    }
    list_id=[]
    response=requests.post(url=url,data=data,headers=headers).json()
    print(response)
    for i in response['list']:
    list_id.append(i['ID'])

    print(list_id)
    name_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    for j in list_id:

    data2={
    'id':j
    }
    fp=open("药监局数据.json",'a')
    fp.write('\n')
    response2=requests.post(url=name_url,data=data2,headers=headers).json()
    json.dump(response2,fp=fp,ensure_ascii=False)
    print("爬取完毕")

    三个图片网站的批量下载

  • 大同小异的图片扒取练习

    1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import requests
    from lxml import etree
    import os
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    url='http://pic.netbian.com/4kmeinv/'
    # 获取响应
    response=requests.get(url=url,headers=headers).text
    # print(response)
    # 数据解析
    tree=etree.HTML(response)
    li_list=tree.xpath('//div[@class="slist"]/ul/li')
    print(li_list)
    # 创建一个文件夹
    if not os.path.exists('./picture'):
    os.mkdir('./picture')
    # 遍历 再解析
    for i in li_list:
    img_src='http://pic.netbian.com'+i.xpath('./a/img/@src')[0]
    img_name=i.xpath('./a/img/@alt')[0]+'.jpg'
    # 通用请求中文乱码解决方案
    img_name=img_name.encode('iso-8859-1').decode('gbk')
    #存储文件
    img_data=requests.get(url=img_src,headers=headers).content
    img_path='picture/'+img_name
    with open(img_path,'wb') as fp:
    fp.write(img_data)
    print(img_name,'下载成功')

    2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import os
    import requests
    from lxml import etree
    if not os.path.exists('./图片3'):
    os.mkdir('./图片3')
    url='https://sc.chinaz.com/tupian/xingganmeinvtupian.html'
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    response=requests.get(url=url,headers=headers).text
    tree=etree.HTML(response)
    img_src=tree.xpath('//*[@id="container"]/div/div/a/@href')
    img_list=[

    ]
    for j in img_src:
    img_src2='https:'+j
    img_list.append(img_src2)
    print(img_list)
    for inn in img_list:
    response2=requests.get(url=inn,headers=headers).text
    tree2=etree.HTML(response2)
    img_u=tree2.xpath('//div[@class="downbody"]/div[3]/a[1]/@href')[0]
    print(img_u)
    response3=requests.get(url=img_u,headers=headers).content
    img_name=inn.split('/')[-1]+'.rar'
    img_path='./图片3/'+img_name
    with open(img_path,'wb') as fp:
    fp.write(response3)
    print("下载完成")


    3

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import os
    from lxml import etree
    import requests
    if not os.path.exists('./图片4'):
    os.mkdir('./图片4')
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    url='https://www.game234.com/meizi/index_%d.html'
    for k in range(2,10):
    new_url=format(url%k)
    sponse=requests.get(url=new_url,headers=headers).text
    tree=etree.HTML(sponse)
    img_p=tree.xpath('//*[@id="sortable"]/div/div/a/@href')
    for i in img_p:
    img_src='https://www.game234.com'+i
    sponse2=requests.get(url=img_src,headers=headers).text
    tree2=etree.HTML(sponse2)
    img_q=tree2.xpath('//*[@id="article-box"]/div[2]/img/@src')
    print(img_q)
    for j in img_q:
    img_list=j
    response3=requests.get(url=j,headers=headers).content
    img_name=j.split('/')[-1]
    img_path='./图片4/'+img_name
    with open(img_path,'wb') as fp:
    fp.write(response3)

文章作者: 贾志飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 贾志飞 !
评论
  目录