開始寫爬蟲時,遇到和js有關的內容只能繞過去,盡可能翻源碼找或者模擬post之類的辦法獲得想要的內容。
但是不是所有的post都能模擬的,或者說對于那些有很長的加密和一些莫名繁多的參數(shù)以及動不動給你返回一大堆java后端接口信息的post,分析起來成本過高。
于是考慮模擬點擊事件不失為另一種可行的策略。
為什么選擇selenium
嗯,selenium是一個很好的自動化測試工具(瀏覽器)集/組件。
可能滿足需求的還有PhantomJS和Ghost.py之類的東西,但是當我發(fā)現(xiàn)Ghost.py is very headless,并且 得知在Python中使用PhantomJS的一個比較好的辦法是基于selenium 后,那直接選擇selenium好了。
selenium Python還有一份精心維護的比Ghost.py的官方文檔寫的還好的非官方文檔: 我是文檔
關于文檔,我會告訴你前一陣我用grab這個庫,它的作者是俄羅斯人以至于很多的troubleshooting和issue都是俄文,我差點學會俄語了好嗎。
一份簡短的代碼
selenium.webdriver有好多種實現(xiàn),下面是一個選擇Chromedriver的實現(xiàn)方式,包括禁止加載圖片等設置。
總的來說用起來還是很方便的
import time
import pymongo
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.common.exceptions import NoSuchElementException
class Crawler(object):
def __init__(self):
# selenium and webdriver settings
# ignore the img
chromeOptions = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images":2}
chromeOptions.add_experimental_option("prefs",prefs)
website = 'your website'
self.driver = webdriver.Chrome('your chromedriver location', chrome_options=chromeOptions)
# mongo settings
client = pymongo.MongoClient("localhost", 27017)
db = client.your_db
self.table = db.your_table
# start
self.driver.get(website)
def crawl(self):
while True:
# refresh
self.driver.delete_all_cookies()
self.driver.refresh()
# possibly without decoy
try:
self.driver.find_element_by_class_name('decoy').click()
except NoSuchElementException:
pass
time.sleep(1)
# question
question = self.driver.find_element_by_class_name('wrapper').text
# current word
word = question.split('
')[1]
# choices
choices = [i.value_of_css_property('background-image').split('(')[1].split(')')[0] for i in self.driver.find_element_by_class_name('choices').find_elements_by_tag_name('a')]
# .......
if __name__ == '__main__':
Crawler().crawl()