Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python无头抓取时,是否可以替代Selenium/Webdriver来填充字段?_Python_Python 2.7_Web Scraping_Screen Scraping_Urllib2 - Fatal编程技术网

使用Python无头抓取时,是否可以替代Selenium/Webdriver来填充字段?

使用Python无头抓取时,是否可以替代Selenium/Webdriver来填充字段?,python,python-2.7,web-scraping,screen-scraping,urllib2,Python,Python 2.7,Web Scraping,Screen Scraping,Urllib2,在Python2.7中,我使用的是urllib2,当需要一些Xpath时,lxml。它的速度很快,而且因为我很少需要浏览网站,所以这种组合效果很好。但有时,通常当我到达一个页面时,当填写一个简短的表单并单击提交按钮()时,只显示一些有价值的数据,使用urllib2的仅抓取方法是不够的 每次遇到这样的页面时,我都可以调用selenium.webdriver来重新蚀刻页面并进行表单填充和单击,但这会大大降低速度 注意:这个问题不是关于urllib2的优点或局限性,我知道已经有很多讨论。而是集中在寻找

在Python2.7中,我使用的是urllib2,当需要一些Xpath时,lxml。它的速度很快,而且因为我很少需要浏览网站,所以这种组合效果很好。但有时,通常当我到达一个页面时,当填写一个简短的表单并单击提交按钮()时,只显示一些有价值的数据,使用urllib2的仅抓取方法是不够的

每次遇到这样的页面时,我都可以调用
selenium.webdriver
来重新蚀刻页面并进行表单填充和单击,但这会大大降低速度


注意:这个问题不是关于urllib2的优点或局限性,我知道已经有很多讨论。而是集中在寻找一种快速、无头的方法来形成填充等(如果需要的话,也允许XPath查询)。

有几件事你可以考虑使用:

  • selenium
    使用无头浏览器,例如,或使用常规浏览器,但在

  • 有几件事你可以考虑使用:

    • selenium
      使用无头浏览器,例如,或使用常规浏览器,但在
    除了这些,另一种选择是使用GUI浏览器工具,如Firefox的Web控制台 检查单击“提交”按钮时发布的帖子。有时候你 可以找到POST数据并简单地欺骗它。例如,使用示例 你发布的url,如果你

    • 使用Firefox转到
    • 单击工具>Web开发人员>Web控制台
    • 单击网络>记录请求和响应主体
    • 填写表格,单击“搜索”
    • 在Web控制台中左键单击(第一个)帖子
    • 右键单击(第一个)帖子,选择“复制帖子数据”
    • 在文本编辑器中粘贴帖子数据
    你会得到类似的结果

    all
    field_36[]=73
    field_37[]=76
    field_32[]=82
    submit=Search
    
    (请注意,Web控制台菜单根据您的Firefox版本有所不同,所以YMMV。)然后您可以使用以下代码欺骗帖子:

    import urllib2
    import urllib
    import lxml.html as LH
    
    url = "http://apply.ovoenergycareers.co.uk/vacancies/#results"
    params = urllib.urlencode([('field_36[]', 73), ('field_37[]', 76), ('field_32[]', 82)])
    response = urllib2.urlopen(url, params)
    content = response.read()
    root = LH.fromstring(content)
    print('\n'.join([tag.text_content() for tag in root.xpath('//dl')]))
    
    产生

      Regulatory Data Analyst
              Contract Type
                Permanent
                        Contract Hours
                Full-time
                        Location
                Bristol
                        Department
                Business Intelligence
                        Full description
    
    如果您检查HTML并搜索
    字段\u 36[]
    ,您会发现

    <div class="multiwrapper">
    <p class="sidenote multi">(Hold the ctrl (pc) or cmd (Mac) keys for multi-selects) </p>
    <select class="select-long" multiple size="5" name="field_36[]" id="field_36"><option value="0">- select all -</option>
    <option selected value="73" title="Permanent">Permanent</option>
    <option value="74" title="Temporary">Temporary</option>
    <option value="75" title="Fixed-term">Fixed-term</option>
    <option value="81" title="Intern">Intern</option></select>
    </div>
    
    
    

    (按住ctrl(pc)或cmd(Mac)键进行多项选择)

    -全选- 永久的 暂时的 定期 实习生
    从中很容易推测,
    field_36[]
    控制
    合同类型
    ,值
    73
    对应于“永久性”、
    74
    对应于“临时性”,等等。同样,您可以找出
    field_37[]
    field_32[]
    所有
    的选项(可以是任何搜索词字符串)。如果您对HTML有很好的理解,您甚至可能不需要浏览器工具来构建文章。

    除了这些工具之外,另一种选择是使用GUI浏览器工具,如Firefox的Web控制台来 检查单击“提交”按钮时发布的帖子。有时 可以找到POST数据并简单地欺骗它 你发布的url,如果你

    • 使用Firefox转到
    • 单击工具>Web开发人员>Web控制台
    • 单击网络>记录请求和响应主体
    • 填写表格,单击“搜索”
    • 在Web控制台中左键单击(第一个)帖子
    • 右键单击(第一个)帖子,选择“复制帖子数据”
    • 在文本编辑器中粘贴帖子数据
    你会得到类似的结果

    all
    field_36[]=73
    field_37[]=76
    field_32[]=82
    submit=Search
    
    (请注意,Web控制台菜单根据您的Firefox版本有所不同,所以YMMV。)然后您可以使用以下代码欺骗帖子:

    import urllib2
    import urllib
    import lxml.html as LH
    
    url = "http://apply.ovoenergycareers.co.uk/vacancies/#results"
    params = urllib.urlencode([('field_36[]', 73), ('field_37[]', 76), ('field_32[]', 82)])
    response = urllib2.urlopen(url, params)
    content = response.read()
    root = LH.fromstring(content)
    print('\n'.join([tag.text_content() for tag in root.xpath('//dl')]))
    
    产生

      Regulatory Data Analyst
              Contract Type
                Permanent
                        Contract Hours
                Full-time
                        Location
                Bristol
                        Department
                Business Intelligence
                        Full description
    
    如果您检查HTML并搜索
    字段\u 36[]
    ,您会发现

    <div class="multiwrapper">
    <p class="sidenote multi">(Hold the ctrl (pc) or cmd (Mac) keys for multi-selects) </p>
    <select class="select-long" multiple size="5" name="field_36[]" id="field_36"><option value="0">- select all -</option>
    <option selected value="73" title="Permanent">Permanent</option>
    <option value="74" title="Temporary">Temporary</option>
    <option value="75" title="Fixed-term">Fixed-term</option>
    <option value="81" title="Intern">Intern</option></select>
    </div>
    
    
    

    (按住ctrl(pc)或cmd(Mac)键进行多项选择)

    -全选- 永久的 暂时的 定期 实习生

    从中很容易推测,
    field_36[]
    控制
    合同类型
    ,值
    73
    对应于“永久性”、
    74
    对应于“临时性”,等等。同样,您可以找出
    field_37[]
    field_32[]
    所有
    的选项(可以是任何搜索词字符串)。如果你对HTML有很好的理解,你甚至可能不需要浏览器工具来构建帖子。

    这就是我所说的非常详细的内容,非常棒的贡献!确实非常棒的贡献。我的scraper会遇到很多这样的网站,直到它确定它们是基于表单的。所以我想我不得不接受机械化的表单填写/点击方法,除非我能找到另一种可靠的方法来确定每次提交时达到的最终URL。这就是我所说的非常详细的程度,非常棒的贡献!确实非常棒的贡献。我的刮板将遇到许多这样的网站,它不会知道它们是基于表单的所以我想我将不得不采取机械化的表单填写/点击方法,除非我能找到另一种可靠的方法来确定每次提交时达到的最终URL。