使用Python刮擦javascript生成的页面

时间:2015-02-13 12:06:36

标签: javascript jquery python html web-scraping

我需要为https://hasjob.co/设置一些信息,我可以通过登录页面抓取一些信息并照常抓取,但大多数信息只有在你向下滚动到底部时才由Javascript生成页面。

使用python的任何解决方案?

import mechanize
import cookielib
from bs4 import BeautifulSoup
import html2text

import pprint

job = []

# Browser
br = mechanize.Browser()

# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

# Browser options
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

br.addheaders = [('User-agent', 'Chrome')]

# The site we will navigate into, handling it's session
br.open('https://auth.hasgeek.com/login')

# View available forms
##for f in br.forms():
##    print f

# Select the second (index one) form (the first form is a search query box)
br.select_form(nr=1)

# User credentials
br.form['username'] = 'username'
br.form['password'] = 'pass'

br.submit()

##print(br.open('https://hasjob.co/').read())

r = br.open('https://hasjob.co/')


soup = BeautifulSoup(r)


for tag in soup.find_all('span',attrs={'class':'annotation bottom-right'}):

    p = tag.text
    job.append(p)


pp = pprint.PrettyPrinter(depth=6)

pp.pprint(job)

2 个答案:

答案 0 :(得分:2)

出于某种原因,几乎没有人注意到Hasjob有一个Atom提要并且它是从主页链接的。使用feedparser library从Hasjob读取结构化数据非常简单:

import feedparser
feed = feedparser.parse('https://hasjob.co/feed')
for job in feed.entries:
    print job.title, job.link, job.published, job.content

Feed已经过了30天,但是现在已经超过800个条目,并且服务器上有相当多的负载,所以我把它减少到过去24小时的工作。如果您想要定期帮助工作,只需每天至少从此网址加载一次。

答案 1 :(得分:0)

你可以看一下python模块PyV8,它是Google V8 javascript引擎的python包装器。

您也可以尝试通过selenium使用ghostdriver,请参阅此处的示例:Selenium with GhostDriver in Python on Windows。使用selenium,您可以选择在Firefox或Chrome中运行可视化浏览器实例(通过chromedriver),同时让您的工作正常工作,然后在刮刀工作时切换到PhantomJS(无窗口浏览器)。请注意,虽然创建一个完整的浏览器实例可能是一个完全的过度杀伤,但它实际上取决于你正在做什么。如果你没有经常运行它我觉得它很好,但通常硒用于浏览器测试而不是用于刮擦。