美文网首页
python爬虫新手准备工作

python爬虫新手准备工作

作者: WYL_99 | 来源:发表于2020-12-09 15:06 被阅读0次

    需要:requests、bs4、BeautifulSoup、lxml、re、urllib
    Python版本: Python3.7
    运行平台: Windows
    IED: pyCharm 2020.3

    使用 requests 库请求网站

    • 安装 requests 库
      首先在 PyCharm 中安装 requests 库,为此打开 PyCharm,单击“File”(文件)菜单,选择“Setting for New Projects...”命令👇


      文件 - 设置

    选择“Project Interpreter”(项目编译器)命令,确认当前选择的编译器,然后单击左下角的加号


    在搜索框输入:requests(注意,一定要输入完整,不然容易出错),然后单击左下角的“Install Package”(安装库)按钮👇。


    输入requests,然后安装

    安装完成后,会在 Install Package 上显示“Package‘requests’ installed successfully”(库的请求已成功安装)👇;如果安装不成功将会显示提示信息。


    安装成功

    最后记得点击【确定】按钮


    最后记得点击【确定】按钮

    简单的网站抓取

    • 使用 GET 方式抓取数据


      新建python文件
      目录结构
    # hello.py文件
    # 导入requests包
    import requests
    
    url = 'http://www.cntour.cn/'
    strhtml = requests.get(url)
    print(strhtml.text)
    

    快捷键ctrl+shift+F10或者点击

    绿色三角形,就会编译,编译结果如下

    运行结果
    • 使用 POST 方式抓取数据【抓取有道翻译网站】
      有道翻译的网址:http://fanyi.youdao.com/,进入有道翻译页面。
      按快捷键 F12,进入开发者模式,单击 Network,此时内容为空,如下所示:

    在有道翻译中输入“我爱中国”,单击“翻译”按钮,如下所示:


    在开发者模式中,依次单击“Network”按钮和“XHR”按钮,找到翻译数据,如下所示:



    单击 Headers,发现请求数据的方式为 POST。如图所示:


    找到数据所在之处并且明确请求方式之后,接下来开始撰写爬虫。
    首先,将 Headers 中的 URL 复制出来,并赋值给 url,代码如下:


    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    

    POST 的请求获取数据的方式不同于 GET,POST 请求数据必须构建请求头才可以。
    Form Data 中的请求参数如图所示,将其复制并构建一个新字典::


    Form Data中的请求参数
    Form_data = {
            'i': '我爱中国',
            'from': 'AUTO',
            'to': 'AUTO',
            'smartresult': 'dict',
            'client': 'fanyideskweb',
            'salt': '16074811609507',
            'sign': 'e637db0683139d97331fe7a370b6ca82',
            'lts': '1607481160950',
            'bv': '72f8a2699d04985331209000387bc6c3',
            'doctype': 'json',
            'version': '2.1',
            'keyfrom': 'fanyi.web',
            'action': 'FY_BY_REALTlME',
            'typoResult': 'false'
        }
    

    接下来使用 requests.post 方法请求表单数据,代码如下:

    import requests        #导入requests包
    response = requests.post(url, data=Form_data)
    

    将字符串格式的数据转换成 JSON 格式数据,并根据数据结构,提取数据,并将翻译结果打印出来,代码如下:

    import json
    content = json.loads(response.text)
    print(content['translateResult'][0][0]['tgt'])
    

    Beautiful Soup库

    通过 requests 库已经可以抓到网页源码,接下来要从源码中找到并提取数据。Beautiful Soup 是 python 的一个库,其最主要的功能是从网页中抓取数据。Beautiful Soup 目前已经被移植到 bs4 库中,也就是说在导入 Beautiful Soup 时需要先安装 bs4 库。


    安装bs4

    lxml 库

    安装好 bs4 库以后,还需安装 lxml 库。如果我们不安装 lxml 库,就会使用 Python 默认的解析器。尽管 Beautiful Soup 既支持 Python 标准库中的 HTML 解析器又支持一些第三方解析器,但是 lxml 库具有功能更加强大、速度更快的特点,因此推荐安装 lxml 库。


    安装 lxml

    安装 Python 第三方库后,输入下面的代码,即可开启 Beautiful Soup 之旅:



    粘贴如下:

    #main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a
    

    将 li:nth-child(1)中冒号(包含冒号)后面的部分删掉,代码如下:

    #main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a
    

    使用 soup.select 引用这个路径,代码如下:

    data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
    
    完整代码和运行结果

    清洗和组织数据

    至此,获得了一段目标的 HTML 代码,但还没有把数据提取出来,接下来在 PyCharm 中输入以下代码:

    for item in data:
        result={
            'title':item.get_text(),
            'link':item.get('href')
        }
    print(result)
    
    运行结果

    从上图发现:文章的链接中有一个数字 ID。下面用正则表达式提取这个 ID。需要使用的正则符号如下:

    • 【 \d 】匹配数字
    • 【 + 】匹配前一个字符1次或多次
      在 Python 中调用正则表达式时使用 re 库,这个库不用安装,可以直接调用。
    import re
    for item in data:
        result={
            "title":item.get_text(),
            "link":item.get('href'),
            'ID':re.findall('\d+',item.get('href'))
        }
    print(result)
    
    # 完整代码
    # 导入requests包
    import requests
    from bs4 import BeautifulSoup
    import re
    import time
    # time.sleep(3)
    url = 'http://www.cntour.cn/'
    # 用 GET 方式获取数据; 将获取到的数据存到 strhtml 变量中
    strhtml = requests.get(url)
    # strhtml.text 表示网页源码
    # print(strhtml.text)
    # 首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析。
    # 解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中
    soup = BeautifulSoup(strhtml.text, 'lxml')
    data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
    for item in data:
        result = {
            # 提取的数据是标题和链接,标题在<a>标签中,链接在<a>标签的 href 属性中
            # 提取标签的正文用 get_text() 方法
            # 提取标签中的 href 属性用 get() 方法,在括号中指定要提取的属性数据,即 get('href')。
            'title': item.get_text(),
            'link': item.get('href'),
            'ID': re.findall('\d+', item.get('href'))
        }
    print(result)
    # print(data)
    
    
    完整代码和运行结果

    findall ():第一个参数表示正则表达式,第二个参数表示要提取的文本。

    服务器第一种识别爬虫的方式就是通过检查连接的 useragent 来识别到底是浏览器访问,还是代码访问的。如果是代码访问的话,访问量增大时,服务器会直接封掉来访 IP。服务器识别浏览器访问的方法就是判断 keyword 是否为 Request headers 下的 User-Agent.


    User-Agent

    相关文章

      网友评论

          本文标题:python爬虫新手准备工作

          本文链接:https://www.haomeiwen.com/subject/whocgktx.html