使用Python无头抓取时,是否可以替代Selenium/Webdriver来填充字段?
在Python2.7中,我使用的是urllib2,当需要一些Xpath时,lxml。它的速度很快,而且因为我很少需要浏览网站,所以这种组合效果很好。但有时,通常当我到达一个页面时,当填写一个简短的表单并单击提交按钮()时,只显示一些有价值的数据,使用urllib2的仅抓取方法是不够的 每次遇到这样的页面时,我都可以调用使用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的优点或局限性,我知道已经有很多讨论。而是集中在寻找
selenium.webdriver
来重新蚀刻页面并进行表单填充和单击,但这会大大降低速度
注意:这个问题不是关于urllib2的优点或局限性,我知道已经有很多讨论。而是集中在寻找一种快速、无头的方法来形成填充等(如果需要的话,也允许XPath查询)。
有几件事你可以考虑使用:
使用无头浏览器,例如,或使用常规浏览器,但在selenium
使用无头浏览器,例如,或使用常规浏览器,但在selenium
- 使用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。