您的位置:首页 > 其它

爬虫技术 课1

2020-07-14 04:29 344 查看

爬虫技术初级课

文章目录

  • 2 基础概念
  • 2.2 技术介绍
  • 3 实例
  • 3 静态网页的爬取
  • 4 动态网页的爬取

  • tips:注释快捷键 ctrl+/
    注释 # ‘’’……’’’
    开发者工具快捷键 F12

    1 原理

    1.1 概念

    收集互联网数据的工具,自动下载网页的计算机程序或自动化脚本

    1.2 爬虫工作原理

    步骤 备注
    1.请求网页 客户端向网页服务器发送请求(url)
    2.服务器响应 HTTP的请求过程:
    网页开发者工具,去查看请求到的响应信息
    url:客户端向服务器发送请求,用到的统一资源定位符(网址)
    请求模式:get, post
    3.解析获取的内容 HTML的技术: CSS皮肤 JavaScript肌肉 html骨架
    4.将解析到的内容保存到本地,进行数据分析 技术:json, csv, excel,mysql

    2 基础概念

    2.1 常用库

    使用方法
    1.请求网页,响应网页内容时,常用的python库 urllib,request, selenium(模拟浏览器),scrapy框架
    2.解析网页的库 正则,lxml(XPath),BeautifulSoup(bs4),pyquery
    3.保存到本地 python中保存信息的地方

    2.1.1 request库

    请求网页库

    import request
    request.get(url,headers=ua)

    查看网页状态的属性:res_v2 = status_code
    网页源码:res_v2.content

    2.1.2 解析库 BeautifulSoup

    from bs4 import  BeautifulSoup

    2.2 技术介绍

    2.2.1 HTTP:

    请求模式:get,post区别
    get会将请求的内容显示在url中,post不会显示,post是以表单形式提交的信息
    get最多提交1024kb的内容,post无大小限制

    请求时,一般需给服务器提交的内容
    User-Agent: 浏览器信息
    tips:爬虫时,提交User-Agent,就可以模拟浏览器访问,否则会被识别为爬虫,可能被反爬虫
    常见User-Agent大全

    cookies机制:网站为了辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据

    服务器响应的状态码:

    常用状态码 含义
    200 请求成功
    400 语法错误
    403 服务器拒接您的请求
    404 请求失败,服务器没有该资源
    500 服务器内容错误
    503 服务器目前无法使用

    2.2.2 HTML

    HTML(标记 标签 属性)

    3 实例

    Case1:请求网页

    import urllib3
    url = "http://www.163.com"  #要请求的网址
    http = urllib3.PoolManager()  #声明一个urllib3的请求对象
    ua = {"User_Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
    respone_vl = http.request('Get',url,headers=ua)#请求语句
    print("服务器响应的状态码:",respone_vl.status)
    # print("服务器响应的内容:",respone_vl.data)
    # respone_vl.encoding = 'utf-8'#改变编码方式
    print(respone_vl.data.decode("gbk"))  #转换编码

    Case2:解析网页

    xpath库

    #2.解析网页内容
    from lxml import etree #解析库1
    #将网页转化为xpath能够解析的格式
    etree_html = etree.HTML(html,parser = etree.HTMLParser(encoding='utf-8'))
    #修正转换后的HTML格式
    # result = etree.tostring(etree_html,encoding='utf-8',pretty_print=True)
    # print(result.decode('utf-8'))
    
    title = etree_html.xpath('//title/text()')#用xpath取网站标题
    print(title)
    meta = etree_html.xpath("//ul[@class='navbar']/li/a/text()")
    print(meta)
    1. 转换请求内容为xpath库能解析的格式
    2. 补全网页格式(因为在1.中,可能会出现丢失网页标记的情况,因此需要补全)
    3. xpath提取网页内容的表达式
    表达式
    nodename 选取nodename 的所有子节点
    nodename
    第n个元素
    / 从当前节点
    // 从当前节点选取所有子孙节点
    . 选取当前节点
    @ 选取属性

    4.text()选取当前节点的文本
    5.HTML的标记,提取频率较高的标记有:

    a 超链接 文本,网址
    div
    p 文字标记
    span
    ul
    li

    常用属性:
    id属性:一般用于定位一个值时(因为网页中的id是不重复的)
    class属性:一般用于定位批量值时(网页中的class属性是可以重复的)

    开发者工具的使用:
    elements :面板
    network :面板
    application

    6.提取元素路径,右键单击-Copy-xpath

    3 静态网页的爬取

    函数化爬虫

    #爬取古诗文网站的信息
    import  urllib3
    import  chardet
    from  lxml  import  etree
    #函数1:请求网站函数
    def  page_def(url):
    http = urllib3.PoolManager()    #声明一个urllib3的请求对象
    ua = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"}
    res_v1 = http.request('GET',url,headers=ua)    #请求语句
    code_info = chardet.detect(res_v1.data)    #自动识别网页编码,返回一个字典,其中的encoding键,对应的是编码
    
    html= res_v1.data.decode(code_info["encoding"])   #用上面识别到的编码修改网页格式
    return  (html,code_info)
    
    #函数2:转换为可以解析的网页格式函数
    def xpath_def(html):
    et_html = etree.HTML(html[0],parser = etree.HTMLParser(encoding=html[1]['encoding']))
    etree.tostring(et_html,encoding=html[1]['encoding'],pretty_print=True)     #格式修正
    return  et_html
    
    #函数3:解析元素
    def  elem_def(et_html):
    title = et_html.xpath('//title/text()')
    ele_info = title
    return ele_info
    
    #函数4:保存信息函数
    def save_def():
    pass
    
    #主函数
    def  main():
    
    url = "https://www.gushiwen.org/"
    url1 = 'http://www.sina.com.cn'
    page_info = page_def(url1)   #调用函数1
    
    et_html = xpath_def(page_info)    #调用函数2
    
    ele_info = elem_def(et_html)
    print(ele_info)
    #函数入口
    if __name__  == "__main__":
    main()

    4 动态网页的爬取

    图片库

    (未完待续)

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: